我有上千条与下面类似的记录
<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更改为“”where @tag="852“”,并且不存在带有@code="h"的subfield。在本例中,@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>发布于 2020-04-21 03:15:19
不知道我怎么错过了这一点,但事实证明它很简单
xmlstarlet ed -u '/holding/record/datafield[@tag="852"][not(subfield[@code="h"])]/@ind1' -v ' '发布于 2020-04-21 03:03:03
此xpath表达式应选择正确的目标节点:
"//datafield[@ind1][not(subfield[@code="h"])]"https://stackoverflow.com/questions/61329488
复制相似问题