如何 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 Timmermann 和 Ulrike 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,但很难构建一个:
/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>
在这种情况下,以下 "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
子元素 code
为 4
的字符串值为 "trl"
,添加另一个谓词,[subfield[@code='4']='trl']
:
/record/datafield[@tag='700'][@ind1='1'][@ind2=' ']
[subfield[@code='4']='trl']
/subfield[@code='a']/text()
我有一些关于书籍的 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 提供了帮助翻译这本书。
在这种情况下,以下 "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,但很难构建一个:
/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>
在这种情况下,以下 "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
子元素 code
为 4
的字符串值为 "trl"
,添加另一个谓词,[subfield[@code='4']='trl']
:
/record/datafield[@tag='700'][@ind1='1'][@ind2=' ']
[subfield[@code='4']='trl']
/subfield[@code='a']/text()