【发布时间】:2020-11-16 02:55:45
【问题描述】:
MARCXML 文件 foo.xml 的结构如下:
<record><header><identifier>myID001</identifier><datestamp>2020-10-12</datestamp></header><metadata><marcxml:collection xmlns:marcxml="http://www.loc.gov/MARC21/slim">
<marcxml:record>
<marcxml:datafield ind1=" " ind2=" " tag="084">
<marcxml:subfield code="2">rvk</marcxml:subfield>
<marcxml:subfield code="a">MG 98092</marcxml:subfield>
</marcxml:datafield>
<marcxml:datafield ind1=" " ind2=" " tag="084">
<marcxml:subfield code="2">bk</marcxml:subfield>
<marcxml:subfield code="a">89.52</marcxml:subfield>
</marcxml:datafield>
<marcxml:datafield ind1=" " ind2=" " tag="084">
<marcxml:subfield code="2">ddc</marcxml:subfield>
<marcxml:subfield code="a">320.9439</marcxml:subfield>
</marcxml:datafield>
</marcxml:record>
</marcxml:collection>
</metadata></record>
我只想提取<marcxml:subfield code="a"> 的内容,其中前一个字段<marcxml:subfield code="2"> 包含字符串'bk'。
因此,本示例中所需的输出为:89.52。
到目前为止,我尝试过
xmlstarlet sel -N marcxml="http://www.loc.gov/MARC21/slim" -t -m "//marcxml:collection/marcxml:record/marcxml:datafield/marcxml:subfield[text()='bk']" -v '//marcxml:collection/marcxml:record/marcxml:datafield/marcxml:subfield[text()]' -nl foo.xml
导致
rvk
MG 98092
bk
89.52
ddc
320.9439
如何用 XMLStarlet 做到这一点?
【问题讨论】:
-
有些不清楚:
<marcxml:subfield code="a">三个都满足要求,那为什么预期的输出只有89.52? -
我想根据 '
' 中的某些条件进行选择:如果包含的字符串不是 'bk',则忽略。 -
对不起;在问题中错过了这一点。见下文。
标签: xml xml-namespaces xmlstarlet