如何筛选出某些类型的元素,这些元素不具有具有魔术值的属性,并保留文档的其余部分?所有这些都是使用xmlstarlet
我要做的是:

cat << EOF > database.xml
<?xml version="1.0"?>
<database>

    <some name="A" />
    <some name="B" />
    <some name="C" />
    <text>this is some text to be applied...</text>
    <project>
        <test deeper="structure"/>
    </project>

</database>
EOF


xmlstarlet sel -t -m "*" -c "*[not(self::some[@name != 'A'])]" database.xml

产量
<some name="A"/><text>this is some text to be applied...</text><project>
        <test deeper="structure"/>
    </project>

但这隐藏了我宝贵的。除了压痕,这不是问题…当<database>不是tag的直系后代时不起作用,例如<some>的子代。
我想得到的是数据库的原样,但是除了名为<database>的数据库之外,所有的<project>都被删除了:
<database>

    <some name="A" />


    <text>this is some text to be applied...</text>
    <project>
        <test deeper="structure"/>
    </project>

</database>

问候语

最佳答案

不幸的是,xmlstarlet的sel不支持apply-templates,但您可以使用ed命令执行以下操作:

xmlstarlet ed -d '/database//some[@name != "A"]' input.xml

09-05 18:43