xmlstarlet按属性而非元素匹配解析XML结果重复问题求解
问题根因
你编写的xmlstarlet命令出现笛卡尔积重复输出,核心问题出在第三层匹配的路径规则:
- 多层
-m(匹配)参数嵌套时,内层匹配如果使用//开头的全局路径,会忽略外层已匹配到的节点上下文,全局扫描所有符合路径的节点。你第三层写的//views/view/viewInitiators/viewInitiator会在每次遍历到任意view节点时,拉取所有view下的全部initiator节点做拼接,自然就出现了跨view的重复组合。 - 内层匹配默认支持相对路径,即相对于外层已匹配的当前节点的层级路径,你可以用这个特性限定只取当前view下的initiator节点。
修正后的命令
xmlstarlet sel -t \ -m //cluster \ --var sn=@top-level-assembly \ -m //views/view \ --var view=@name \ -m viewInitiators/viewInitiator \ -v 'concat($sn,"-",$view,",",@id)' -n test.xml
输出结果
运行修正后的命令会直接得到你期望的输出:
XYZ12312312312-ABC,ABCi1 XYZ12312312312-ABC,ABCi2 XYZ12312312312-DEF,DEFi1 XYZ12312312312-DEF,DEFi2
内容的提问来源于stack exchange,提问作者Noso Opforu
相关产品推荐
相关产品推荐

