我有一个XML文档,我想使用XMLStarlet从所有元素(或给定类型的所有元素)中删除某种类型的所有属性及其值,而不会干扰其其他属性。
例如,我想从任何a
元素中删除所有bad
属性:
<root>
<a href="." bad="yes"/>
<a bad=""/>
</root>
成为
<root>
<a href="."/>
<a/>
</root>
XMLStarlet 的 ed
子命令有一个--delete
或-d
选项。
从a
元素中删除bad
属性:
xmlstarlet ed -d '//a/@bad' input.xml
删除所有bad
属性:
xmlstarlet ed -d '//@bad' input.xml
我不知道
有什么方法可以直接xmlstarlet
执行此操作,但据我所知,您可以调用 XSLT 转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@bad"/>
</xsl:stylesheet>
使用类似于以下内容的命令应用样式表(信息取自此处):
xml tr stylesheet.xsl input.xml
生成的 XML 文件:
<root>
<a href="."/>
<a/>
</root>
从所有元素(或给定类型的所有元素)
如果您只想从某些元素中移除 bad
属性,而不是全部
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="element/@bad"/>
</xsl:stylesheet>
其中"element"是不应再带有 bad
属性的元素的名称。