我有一個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
屬性的元素的名稱。