2014-12-23 107 views
1

我有一個XML文檔,我想使用XMLStarlet從所有元素(或給定類型的所有元素)中刪除某個類型的所有屬性及其值,而不會打擾它其他屬性。使用XMLStarlet刪除屬性

例如,我想從任何a元素刪除所有bad屬性:

<root> 
    <a href="." bad="yes"/> 
    <a bad=""/> 
</root> 

成爲

<root> 
    <a href="."/> 
    <a/> 
</root> 

回答

7

XMLStarlet的ed子命令有一個--delete-d選項。

刪除bada元素屬性:

xmlstarlet ed -d '//a/@bad' input.xml 

刪除所有bad屬性:

xmlstarlet ed -d '//@bad' input.xml 
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> 

從所有元素(或的所有元素給定類型)

如果您只想刪除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屬性的元素的名稱。