我有以下XML:
<?xml version="1.0" encoding="UTF-8"?>
<collection
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.loc.gov/MARC21/slim..."
xmlns="http://www.loc.gov/MARC21/slim">
<record>
<leader>01877nz a2200433o 4500</leader>
<controlfield tag="001">1</controlfield>
<datafield tag="013" ind1=" " ind2=" ">
<subfield code="a">formerge</subfield>
</datafield>
...
<datafield tag="150" ind1=" " ind2=" ">
<subfield code="a">Borneo</subfield>
</datafield>
...
<datafield tag="550" ind1=" " ind2=" ">
<subfield code="w">g</subfield>
<subfield code="a">South East Asia</subfield>
<subfield code="c">c_7260</subfield>
</datafield>
...
</record>
...
<record>
...
...
</record>
<record>
<leader>02462nz a2200553o 4500</leader>
<controlfield tag="001">2</controlfield>
...
<datafield tag="013" ind1=" " ind2=" ">
<subfield code="a">formerge</subfield>
</datafield>
<datafield tag="035" ind1=" " ind2=" ">
<subfield code="a">c_7260</subfield>
</datafield>
...
<datafield tag="151" ind1=" " ind2=" ">
<subfield code="a">South East Asia</subfield>
</datafield>
...
</record>
从具有子节点子字段代码a的datafield tag = 550开始,我想基于datafield标签151子字段代码a添加controlfield标签001的值。在这种情况下,它是&#34; 2&#34;。在某些情况下,要匹配的数据字段标记也可以是150。节点树上的节点上有更多节点,但基本上它们如下所示:
<record>
<leader>...</leader>
<controlfield tag="001">..</controlfield> --> this one can be up to 010
<datafield tag="150" ind1=" " ind2=" "> --> this one can be from 011 to 999
<subfield code="a">..</subfield> --> attributes can be 0-9, a-z
...
</subfield>
</datafield>
</record>
所以我仍然希望保留xml,因为它只是添加了我想要的值,如下所示:
...
<datafield tag="150" ind1=" " ind2=" ">
<subfield code="a">Borneo</subfield>
</datafield>
...
<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>
XSLT甚至可以实现这一点吗?有人可以带我到我需要阅读的内容吗?我在思考&#34;键&#34;但可能会有另一个。提前谢谢!
更新: 我有以下模板,我添加了Abel的代码:
<?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:template match="/">
<xsl:apply-templates />
<xsl:apply-templates select="//datafield"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:variable name="next-ctl" select="
generate-id(
../controlfield[@tag = '001']
/following-sibling::controlfield[1])" />
<xsl:template match="//datafield[@tag = '550'][subfield[@code = 'a']]">
<xsl:value-of select="../controlfield[@tag = '001']
[following-sibling::datafield
[@tag = '151']
[subfield[@code = 'a']]
[following-sibling::controlfield
[generate-id(.) = $next-ctl
or not(following-sibling::controlfield)]
]
]" />
</xsl:template>
答案 0 :(得分:0)
XSLT甚至可以实现这一点吗?
是的,它适用于这样的任务。
有人可以带我到我需要阅读的内容吗?
如果您不熟悉XSLT this video tutorial by Dimitre Novatchev is a very good introduction on XSLT,那将为您省去很多麻烦。这花费了几美元或几个小时。
从datafield tag = 550
开始
即:
<xsl:template match="datafield[@tag = '550']">...
...使用子节点子字段代码a,
即:
<xsl:template match="datafield[@tag = '550'][subfield[@code = 'a']]">...
我想添加controlfield tag 001的值
即,假设焦点来自先前的匹配模板:
<xsl:value-of select="../controlfield[@tag = '001']" />
基于数据字段标记151子字段代码a。
由于datafield
元素似乎是controlfield
的兄弟(我假设每个控制字段后跟一组数据字段),我将假设它们必须属于以下兄弟姐妹,但在此之前下一个控制区,但要根据您的需要进行调整。
即:
<xsl:variable name="next-ctl" select="
generate-id(
../controlfield[@tag = '001']
/following-sibling::controlfield[1])" />
<xsl:value-of select="
../controlfield[@tag = '001']
[following-sibling::datafield
[@tag = '151']
[subfield[@code = 'a']]
[following-sibling::controlfield
[generate-id(.) = $next-ctl
or not(following-sibling::controlfield)]
]
]" />
注意:如果表达式变得复杂,并且简化并不简单(即拆分和使用变量),您可以考虑切换到XSLT 2.0,它允许更多的表达自由,表达式内的注释(即所谓的笑脸) -comments,(:...:)
)并且有更多的测试方法(在这种情况下,例如,如果一个元素位于文档顺序中的另一个元素之前:<<
和>>
运算符)。
在这种情况下,它是&#34; 2&#34;。
上面的代码没有经过测试(你的要求太复杂了,我担心我会误解它们),但这可能就是这些。
在某些情况下,要匹配的数据字段标记也可以是150。
在哪些情况下,您应该相应调整。
我在思考&#34;键&#34;但可能会有另一个。
是的,这可能会有所帮助,但这取决于其他要求是否真的需要(见上面的例子)。