XMLStarlet, XPath - 如何根据节点删除属性



我正在尝试使用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 命令的串联:

  1. 第一个删除(-d( 所有不属于<c>元素doc:id属性(就像您已经做的那样(
  2. 命令的第二部分更新(-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

输出是需要的。

最新更新