我正在尝试使用XMLStarlet来转换这个(test.xml(:
<?xml version="1.0"?>
<root xmlns:doc="http://www.test.com" doc:id="hello">
<a doc:id="x"/>
<a doc:id="x"/>
<c doc:id="x">
<a doc:id="x"/>
<a doc:id="x"/>
<c doc:id="x"/>
</c>
</root>
进入这个(删除除c
以外的所有节点上的doc:id
属性(:
<?xml version="1.0"?>
<root xmlns:doc="http://www.test.com" doc:id="hello">
<a/>
<b/>
<c doc:id="hello">
<a/>
<b/>
<c doc:id="hello"/>
</c>
</root>
我已经尝试过这个,但它删除了所有doc:id
属性:
xml ed -N doc="http://www.test.com" -d "//@doc:id[not(self::c)]" test.xml
您可以使用两个 xmlstarlet 命令的串联:
- 第一个删除(
-d
( 所有不属于<c>
元素doc:id
属性(就像您已经做的那样( - 命令的第二部分更新(
-u
(<c>
元素的所有doc:id
属性的值(-v
(。
这是命令:
xml ed -N doc="http://www.test.com" -d "//*[not(self::c)]/@doc:id" -u "//c/@doc:id" -v "hello" test.xml
输出是需要的。