如何 select 包含 XPath 中特定子元素的元素?

How to select an element which contains an specific subelement in 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 TimmermannUlrike Wasel 提供了帮助翻译这本书。

在这种情况下,以下 "simple" XPath 2.0 表达式可以提取 "translators":

/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,但很难构建一个:

场景模型:

<?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>

在这种情况下,以下 "simple" XPath 2.0 表达式可以提取 "translators":

/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=' ' 可能只包含翻译人员,但 "type" 字段与 "trl" 没有任何意义。

如何构建仅从模型场景中选择翻译器的 XPath 2.0 表达式?

要进一步限制此 XPath,

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

到 select 仅那些 datafield 元素的 subfield 子元素 code4 的字符串值为 "trl",添加另一个谓词,[subfield[@code='4']='trl']:

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