【问题标题】:How to select an element which contains an specific subelement in XPath?如何在 XPath 中选择包含特定子元素的元素?
【发布时间】:2018-06-15 11:01:21
【问题描述】:

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

这是来自一本书的一个 MARC21-XML 文档的 sn-p:

<?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 帮助翻译了这本书。

在这种情况下,以下“简单”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 表达式,只从模拟脚本中选择翻译器?

【问题讨论】:

    标签: xml xpath xpath-2.0


    【解决方案1】:

    为了进一步限制这个 XPath,

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-20
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      相关资源
      最近更新 更多