Xpath xmlstarlet只向文件中添加一个元素

Xpath xmlstarlet只向文件中添加一个元素,xpath,xmlstarlet,Xpath,Xmlstarlet,我有数百个xml文件要处理——有些有特定的标签,有些没有。如果我只是将标签添加到所有文件中,那么一些文件会得到2个标签(这并不奇怪!)。如果没有笨拙的grep来选择要处理的文件,我如何在xmlstarlet中进行操作?例如: 我在一些文件中有这一点: ... 我陷入了一些异国情调,比如: xmlstarlet sel --text --template --match //parent_tag --match "//parent_tag/node()[not(self::good_tag)]"

我有数百个xml文件要处理——有些有特定的标签,有些没有。如果我只是将标签添加到所有文件中,那么一些文件会得到2个标签(这并不奇怪!)。如果没有笨拙的grep来选择要处理的文件,我如何在xmlstarlet中进行操作?例如:

我在一些文件中有这一点: ...

我陷入了一些异国情调,比如:

xmlstarlet sel --text --template --match //parent_tag --match "//parent_tag/node()[not(self::good_tag)]" -f --nl */config.xml
。。。但它并没有实现我所希望的…

只需选择不包含
的元素来插入:

xmlstarlet ed -P -S -s '//parent_tag[not(good_tag)]' -t elem -n good_tag -v ""
如果您还想测试标记的正确内容:

xmlstarlet ed -P -S -s '//parent_tag[not(good_tag[.="foobar"])]' -t elem -n good_tag -v ""
xmlstarlet sel --text --template --match //parent_tag --match "//parent_tag/node()[not(self::good_tag)]" -f --nl */config.xml
xmlstarlet ed -P -S -s '//parent_tag[not(good_tag)]' -t elem -n good_tag -v ""
xmlstarlet ed -P -S -s '//parent_tag[not(good_tag[.="foobar"])]' -t elem -n good_tag -v ""