使用xmlstarlet选择不包含特定子节点的节点

时间:2020-04-20 18:29:33

标签: 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="2" ind2=" " tag="852">
      <subfield code="b">OHSUMAIN</subfield>
      <subfield code="c">oldstorjrl</subfield>
    </datafield>
  </record>
</holding>

我需要将datafield @ ind1更改为“”,其中@ tag="852“并且不存在带有{subfield的{​​{1}}。在此示例中,@ code="h"和@ code="b"存在,但@ code="c"不存在,所以我想修改此记录。

我可以考虑使用程序逻辑来实现所需功能的方法,但是我可以基于缺少子节点而直接使用xmlstarlet选择我想要的节点吗?

此记录的所需输出为

code="h"

2 个答案:

答案 0 :(得分:1)

不确定我是如何错过这个的,但是事实证明这很简单

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

答案 1 :(得分:0)

此xpath表达式应选择正确的目标节点:

"//datafield[@ind1][not(subfield[@code="h"])]"
相关问题