如何在XPath中选择包含特定子元素的元素?

伯恩斯克

我有一些有关书籍的MARC21-XML文档。我想提取这本书的翻译者的名字。

这是一本书的一个MARC21-XML文档的摘录:

<?xml version="1.0" encoding="UTF-8"?>
  <record xmlns="http://www.loc.gov/MARC21/slim" type="Bibliographic">
    <datafield tag="700" ind1="1" ind2=" ">
      <subfield code="a">Wasel, Ulrike</subfield>
      <subfield code="4">trl</subfield>
    </datafield>
    <datafield tag="700" ind1="1" ind2=" ">
      <subfield code="a">Timmermann, Klaus</subfield>
      <subfield code="4">trl</subfield>
    </datafield>
    <datafield tag="700" ind1="1" ind2="2">
      <subfield code="a">Eggers, Dave</subfield>
    </datafield>
  </record>

戴夫·埃格斯Dave Eggers)是这本书的作者,克劳斯·蒂默曼Klaus Timmermann)乌尔里克·瓦瑟尔Ulrike Wasel)帮助翻译了该书。

在这种情况下,下面的“简单” XPath 2.0表达式可以提取“转换器”:

/record/datafield[@tag='700'][@ind1='1'][@ind2=' ']/subfield[@code='a']/text()

此XPath 2.0表达式的结果如下:

Text='Wasel, Ulrike'
Text='Timmermann, Klaus'

这似乎很好。但是,我可以想到一个尚未发现的场景,在该场景中,除了翻译器(subfield[@code='a'] = 'trl'

我希望将以下选择逻辑实现为XPath 2.0,但难以构建一个选择逻辑:

  • /record/datafield属性的tag值为“ 700”
  • /record/datafield属性的ind1值为“ 1”
  • /record/datafield属性ind2具有值“”
  • /record/datafield包含subfield属性code等于“ 4”且其text()值为“ trl”

要模拟场景:

<?xml version="1.0" encoding="UTF-8"?>
  <record xmlns="http://www.loc.gov/MARC21/slim" type="Bibliographic">
    <datafield tag="700" ind1="1" ind2=" ">
      <subfield code="a">Wasel, Ulrike</subfield>
      <subfield code="4">trl</subfield>
    </datafield>
    <datafield tag="700" ind1="1" ind2=" ">
      <subfield code="a">Timmermann, Klaus</subfield>
      <subfield code="4">trl</subfield>
    </datafield>
    <datafield tag="700" ind1="1" ind2=" ">
      <subfield code="a">Doe, John</subfield>
      <subfield code="4">oth</subfield>
    </datafield>
    <datafield tag="700" ind1="1" ind2="2">
      <subfield code="a">Eggers, Dave</subfield>
    </datafield>
  </record>

在这种情况下,下面的“简单” XPath 2.0表达式可以提取“转换器”:

/record/datafield[@tag='700'][@ind1='1'][@ind2=' ']/subfield[@code='a']/text()

此XPath 2.0表达式的结果如下:

Text='Wasel, Ulrike'
Text='Timmermann, Klaus'
Text='Doe, John'

而且有一个错误:John Doe不是这本书的翻译(trl)而是其他一些(oth)撰稿人。我不要他;)

我并不熟悉MARC21-XML规范。我阅读的有关MARC21-XML的规范以一种非常奇怪的表格格式,很难理解。可能@ind1='1'并且@ind2=' '仅包含翻译器,但是带有“ trl”的“ type”字段没有意义。

如何构造XPath 2.0表达式,该表达式仅从模拟场景中选择翻译器?

克休斯

为了进一步限制此XPath,

/record/datafield[@tag='700'][@ind1='1'][@ind2=' ']
       /subfield[@code='a']/text()

仅选择datafieldsubfield子元素withcode4字符串值为的那些元素"trl",请添加另一个谓词[subfield[@code='4']='trl']

/record/datafield[@tag='700'][@ind1='1'][@ind2=' ']
                 [subfield[@code='4']='trl']
       /subfield[@code='a']/text()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章