2014-12-23 79 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属性的元素的名称。