使用XMLStarlet删除属性

时间:2014-12-23 06:13:16

标签: xpath xmlstarlet

我有一个XML文档,我想使用XMLStarlet从所有元素(或给定类型的所有元素)中删除某种类型的所有属性及其值,而不会干扰其他属性。

例如,我想从任何bad元素中删除所有a属性:

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

变为

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

2 个答案:

答案 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属性的元素的名称。