こんにちは、この質問はすべてこれに関連しています: xsl get element values from another node treeしかし、今回は動作する xslt があります。
現在、次のxmlに取り組んでいます。
<record>
<leader>01877nz a2200433o 4500</leader>
<controlfield tag="001">1</controlfield>
... (more controlfields tag 002 to 010)
<datafield tag="013" ind1=" " ind2=" ">
<subfield code="a">formerge</subfield>
</datafield>
... (more datafield tags, datafield tags are from 011 to 999)
<datafield tag="150" ind1=" " ind2=" ">
<subfield code="a">Borneo</subfield>
</datafield>
... (more datafield tags, datafield tags are from 011 to 999)
<datafield tag="550" ind1=" " ind2=" ">
<subfield code="w">g</subfield>
<subfield code="a">South East Asia</subfield>
<subfield code="c">c_7260</subfield>
</datafield>
... (more datafield tags, datafield tags are from 011 to 999)
</record>
... (more records)
<record>
... (more records fields)
... (more records fields)
</record>
<record>
<leader>02462nz a2200553o 4500</leader>
<controlfield tag="001">2</controlfield>
... (more controlfields tag 002 to 010)
<datafield tag="013" ind1=" " ind2=" ">
<subfield code="a">formerge</subfield>
</datafield>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="a">c_7260</subfield>
</datafield>
... (more datafield tags, datafield tags are from 011 to 999)
<datafield tag="151" ind1=" " ind2=" ">
<subfield code="a">South East Asia</subfield>
</datafield>
... (more datafield tags, datafield tags are from 011 to 999)
</record>
次の xslt があります。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:marc="http://www.loc.gov/MARC21/slim" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="marc">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:key name="term" match="//datafield[@tag='151'][subfield[@code='a']]" use="." />
<xsl:template match="//datafield[@tag='151'][subfield[@code='a']]">
<xsl:variable name="t550a" select="//datafield[@tag='550'][subfield[@code='a']]" />
<xsl:for-each select="key('term','$550a')">
<xsl:value-of select="//controlfield[@tag='001']" />
</xsl:for-each>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
これで、キー(用語)を介して151個すべてのインデックスを作成しました。変数「t550a」も作成しました。keys 関数を使用して、550a タグ (datafield tag="550" subfield code="a") を term key と照合します。そして、そのキーのコントロールフィールドタグ 001 の値を取得します。また、xml のすべてのノード、つまり「xsl:copy」を取得したかったのです。私が持っている xslt では、datafield タグ 151 が削除されているようです。
私は550フィールドに次のものを入れたかった:
... (other fields omitted)
<datafield tag="550" ind1=" " ind2=" ">
<subfield code="w">g</subfield>
<subfield code="a">South East Asia</subfield>
<subfield code="c">c_7260</subfield>
<subfield code="0">2</subfield>
</datafield>
... (other fields omitted)
<datafield tag="550" ind1=" " ind2=" ">
<subfield code="w">h</subfield>
<subfield code="a">Borneo</subfield>
<subfield code="c">c_1017</subfield>
<subfield code="0">1</subfield>
</datafield>
したがって、東南アジアの 550 サブフィールドには、東南アジアの 151 サブフィールドの制御フィールド 001 に基づいて、値 2 を持つ追加のサブフィールド 0 があります。また、ボルネオの 550 サブフィールドには、ボルネオの 151 サブフィールドの制御フィールド 001 に基づいて、値が 1 のサブフィールド 0 が追加されます。
誰かがこれを正しく行うように導くことができますか? ありがとう!