XMLSTARLET:过滤掉具有属性的元素



如何过滤掉某种类型的元素,这些元素没有具有魔术值的属性并保留文档的其余部分?所有这些都使用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>的孩子。

我想得到的是原样数据库,但除了名为 A 的数据库外,所有数据库<some>删除:

<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

编写一个 XSLT 样式表

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="some[@name != 'A']"/>
</xsl:stylesheet>

然后调用 xmlstarlet 将该样式表应用于输入 XML: xmlstarlet tr sheet.xsl input.xml

相关内容

  • 没有找到相关文章

最新更新