我有一个 XML 文档,我想使用 XMLStarlet 从所有元素(或给定类型的所有元素)中删除特定类型的所有属性及其值,而不影响其其他属性。
例如,我想从任何
bad
元素中删除所有 a
属性:
<root>
<a href="." bad="yes"/>
<a bad=""/>
</root>
成为
<root>
<a href="."/>
<a/>
</root>
XMLStarlet 的
ed
子命令有 --delete
或 -d
选项。
从
bad
元素中删除 a
属性:
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
属性的元素的名称。