【问题标题】:XMLStarlet: Query for MARCXMLXMLStarlet:查询 MARCXML
【发布时间】: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>

我只想提取&lt;marcxml:subfield code="a"&gt; 的内容,其中前一个字段&lt;marcxml:subfield code="2"&gt; 包含字符串'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 做到这一点?

【问题讨论】:

  • 有些不清楚:&lt;marcxml:subfield code="a"&gt; 三个都满足要求,那为什么预期的输出只有89.52
  • 我想根据 '' 中的某些条件进行选择:如果包含的字符串不是 'bk',则忽略。
  • 对不起;在问题中错过了这一点。见下文。

标签: xml xml-namespaces xmlstarlet


【解决方案1】:

尝试以下方法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2017-01-30
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多