2

我有以下 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>

从 datafield tag=550 和子节点子字段代码 a 开始,我想在 datafield tag 151 子字段代码 a 的基础上添加 controlfield tag 001 的值。在这种情况下,它是“2”。在某些情况下,要匹配的数据字段标记也可以是 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 实现吗?有人可以带我阅读我需要阅读的内容吗?我在想“钥匙”,但可能还有另一个。提前致谢!

更新:我有以下模板,我添加了 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>

4

1 回答 1

0

这甚至可以用 XSLT 实现吗?

是的,它适用于这样的任务。

有人可以带我阅读我需要阅读的内容吗?

如果您是 XSLT 的新手,Dimitre Novatchev 的这个视频教程是 XSLT 的一个很好的介绍,将为您省去很多麻烦。几美元或几个小时的花费非常值得。

从数据字段标签 = 550 开始

IE:

<xsl:template match="datafield[@tag = '550']">...

... 带有子节点子字段代码 a,

IE:

<xsl:template match="datafield[@tag = '550'][subfield[@code = 'a']]">...

我想添加控制字段标签 001 的值

即,假设焦点来自以前的匹配模板:

<xsl:value-of select="../controlfield[@tag = '001']" />

基于数据字段标签 151 子字段代码 a。

由于datafield元素似乎是controlfield(我假设每个控制字段后跟一组数据字段)的兄弟,我将假设它们必须在以下兄弟之间,但在下一个控制字段之前,但要根据您的需要进行调整。

IE:

<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,它允许更多的表达自由,表达式内部的注释(即所谓的笑脸评论,(:...:)) 并且有更多的测试方法(在这种情况下,例如,如果一个元素在文档顺序中位于另一个元素之前:<<>>运算符)。

在这种情况下,它是“2”。

上面的代码没有经过测试(你的要求太复杂了,我担心我误解了它们),但它可能是这样的。

在某些情况下,要匹配的数据字段标记也可以是 150。

在这种情况下,您应该相应地进行调整。

我在想“钥匙”,但可能还有另一个。

是的,这可能会有所帮助,但这取决于其他要求是否实际需要(参见上面的示例)。

于 2015-09-07T09:46:15.710 回答