使用 XMLStarlet 删除属性

问题描述 投票:0回答:2

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

例如,我想从任何

bad
元素中删除所有
a
属性:

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

成为

<root>
  <a href="."/>
  <a/>
</root>
xpath xmlstarlet
2个回答
13
投票

XMLStarlet 的

ed
子命令有
--delete
-d
选项。

bad
元素中删除
a
属性:

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>

使用类似于(信息取自此处)的命令应用样式表:

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

© www.soinside.com 2019 - 2024. All rights reserved.