xml - XMLStarlet:查询 MARCXML
问题描述
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
直流电
320.9439
XMLStarlet 如何做到这一点?
解决方案
尝试以下方式:
xmlstarlet sel -N marcxml="http://www.loc.gov/MARC21/slim" -t -v '//marcxml:subfield[@code="2"][text()="bk"]/following-sibling::marcxml:subfield[@code="a"]' -nl foo.xml
推荐阅读
- java - Android Studio北极狐、大黄蜂等如何设置Java JDK路径?
- algorithm - 从 Ax - Restricted Isometry Property 中恢复稀疏向量 x 的算法
- bash - 复杂的 grep 显示文件名和最后一个匹配下面的行
- c++ - 如何在自定义 Tensorflow 操作中获取/重用 cudnnHandle (cudnnHandle_t)
- cloudflare - 启用访问策略后如何修复 Cloudflare Workers 的重定向?
- portforwarding - 尝试将基本 Caddy 反向代理服务器指向 Foundry VTT 游戏服务器时无法正常工作
- bash - shell脚本中的菜单,然后接受用户输入来做正则表达式
- python - JSON对象列上的PostgreSQL JOIN
- c# - unity 2D 的物理运动
- kubernetes - Kubernetes 仪表板中的聚合信息是否在 CLI 中可用?还是通过 API?