我有一个XML文档,我想使用XMLStarlet从所有元素(或给定类型的所有元素)中删除某个类型的所有属性及其值,而不会打扰它其他属性。使用XMLStarlet删除属性
例如,我想从任何a
元素删除所有bad
属性:
<root>
<a href="." bad="yes"/>
<a bad=""/>
</root>
成为
<root>
<a href="."/>
<a/>
</root>
我有一个XML文档,我想使用XMLStarlet从所有元素(或给定类型的所有元素)中删除某个类型的所有属性及其值,而不会打扰它其他属性。使用XMLStarlet删除属性
例如,我想从任何a
元素删除所有bad
属性:
<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>
应用样式表具有类似于(从here取信息)的命令:
xml tr stylesheet.xsl input.xml
生成的XML文件:
<root>
<a href="."/>
<a/>
</root>
从所有元素(或的所有元素给定类型)
如果您只想删除0从某些元素,而不是所有属性,使用
<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>
其中“元素”是应该不再携带bad
属性的元素的名称。