【问题标题】:Use xmlstarlet to select nodes that do NOT contain a specific subnode使用 xmlstarlet 选择不包含特定子节点的节点
【发布时间】:2020-04-21 03:15:19
【问题描述】:

我有数千条类似于下面的记录

<holding>
  <holding_id>2225031160001858</holding_id>
  <record>
    <leader>00210cx a22200085 454500</leader>
    <controlfield tag="001">h38165-01alliance_ohsu</controlfield>
    <controlfield tag="004">b10145746-01alliance_ohsu</controlfield>
    <controlfield tag="005">20200417125900.0</controlfield>
    <controlfield tag="008">2004170u\\\\0\\\0001aaund0999999</controlfield>
    <datafield ind1="2" ind2=" " tag="852">
      <subfield code="b">OHSUMAIN</subfield>
      <subfield code="c">oldstorjrl</subfield>
    </datafield>
  </record>
</holding>

我需要将 datafield @ind1 更改为 " " 其中 @tag="852" 并且不存在 subfield 和 @code="h"。在此示例中,@code="b" 和 @code="c" 存在,但@code="h" 没有,所以我想修改这条记录。

我可以想办法使用程序逻辑来完成我需要的事情,但是我可以直接使用xmlstarlet根据没有子节点来选择我想要的节点吗?

这条记录的期望输出是

<holding>
  <holding_id>2225031160001858</holding_id>
  <record>
    <leader>00210cx a22200085 454500</leader>
    <controlfield tag="001">h38165-01alliance_ohsu</controlfield>
    <controlfield tag="004">b10145746-01alliance_ohsu</controlfield>
    <controlfield tag="005">20200417125900.0</controlfield>
    <controlfield tag="008">2004170u\\\\0\\\0001aaund0999999</controlfield>
    <datafield ind1=" " ind2=" " tag="852">
      <subfield code="b">OHSUMAIN</subfield>
      <subfield code="c">oldstorjrl</subfield>
    </datafield>
  </record>
</holding>

【问题讨论】:

  • 请将该示例输入的所需输出(无描述)添加到您的问题(无评论)。
  • 欢迎来到 Stack Overflow。 SO 是面向专业和热情的程序员的问答页面。将您自己的代码添加到您的问题中。您应该至少展示自己为解决这个问题所做的研究。

标签: xmlstarlet


【解决方案1】:

不知道我是怎么错过的,但结果很简单

xmlstarlet ed -u '/holding/record/datafield[@tag="852"][not(subfield[@code="h"])]/@ind1' -v ' '

【讨论】:

    【解决方案2】:

    这个 xpath 表达式应该选择正确的目标节点:

    "//datafield[@ind1][not(subfield[@code="h"])]"
    

    【讨论】:

    • 数据字段可以有很多标签和指标,所以这会产生不希望的变化
    猜你喜欢
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2021-11-15
    相关资源
    最近更新 更多