gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:02:46 28 4
gpt4 key购买 nike

我有一些关于书籍的 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 帮助翻译了这本书。

在这种情况下,以下“简单”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()

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

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

关于xml - 如何在XPath中选择包含特定子元素的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48116877/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com