【问题标题】:Remove an attribute with XMLStarlet使用 XMLStarlet 删除属性
【发布时间】:2014-12-23 06:13:15
【问题描述】:

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

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

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

变成

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

【问题讨论】:

    标签: xpath xmlstarlet


    【解决方案1】:

    XMLStarlet 的ed 子命令有一个--delete-d 选项。

    a 元素中删除bad 属性:

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

    删除所有bad 属性:

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

    【讨论】:

      【解决方案2】:

      我不知道有什么方法可以让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>
      

      其中“元素”是不应再带有bad 属性的元素的名称。

      【讨论】:

        猜你喜欢
        • 2022-10-13
        • 2022-11-11
        • 2013-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多