我有以下输入xml文件:
<rootnode>
<section id="1" status="fail">
<outer status="fail">
<inner status="fail"/>
<inner status="pass"/>
</outer>
<outer status="pass">
<inner status="pass"/>
</outer>
<outer status="pass"/>
<outer status="fail"/>
</section>
<section id="2" status="fail">
<outer status="fail">
<inner status="pass"/>
<inner status="fail"/>
<inner status="inc"/>
</outer>
</section>
</rootnode>
我想过滤掉所有非失败状态节点,以便结果如下所示:
<rootnode>
<section id="1" status="fail">
<outer status="fail">
<inner status="fail"/>
</outer>
<outer status="fail"/>
</section>
<section id="2" status="fail">
<outer status="fail">
<inner status="fail"/>
</outer>
</section>
</rootnode>
<rootnode>
不一定必须包含在结果中 . 我试图使用带有xpath表达式的 xmllint
. 我可以用 . 提取特定节点
xmllint --xpath "//inner" input.xml
xmllint --xpath "//@status" input.xml
但它们只返回节点而不考虑 status
的值,或者只返回没有周围节点的属性 .
有没有办法用xpath表达式做到这一点?如果没有,一个包含其他bash工具的简单解决方案也很好 .
1 回答
就像@svasa在评论中所说,你应该使用XSLT . 您可以使用xsltproc,xmlstarlet(使用
tr
命令),Saxon(command line上的java)等轻松处理bash中的XSLT .这是使用xsltproc的示例:
XML Input (so.xml)
XSLT 1.0 (so.xsl)
您可以做的是省略XML声明(
omit-xml-declaration="yes"
中的omit-xml-declaration="yes"
),并检查是否有任何带有status="fail"
的元素 . 我为此使用了一个键(xsl:key
)......