我有一个XML文档,我想使用XMLStarlet从所有元素(或给定类型的所有元素)中删除某种类型的所有属性及其值,而不会干扰其他属性。
例如,我想从任何bad
元素中删除所有a
属性:
<root>
<a href="." bad="yes"/>
<a bad=""/>
</root>
变为
<root>
<a href="."/>
<a/>
</root>
答案 0 :(得分:8)
XMLStarlet的ed
子命令有--delete
或-d
选项。
从bad
元素中删除a
属性:
xmlstarlet ed -d '//a/@bad' input.xml
删除所有bad
属性:
xmlstarlet ed -d '//@bad' input.xml
答案 1 :(得分:1)
我不知道有任何方法让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>
来自所有元素(或给定类型的所有元素)
如果您只想从某些元素中删除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
属性的元素的名称。