移动节点并删除xslt中同一行中的属性

时间:2016-05-05 16:46:35

标签: xslt

从以下文件开始:

<foo>
  <bar>
    <items>
      <item attribull="true" name="foo" />
      <item attribull="false" name="bar" />
      <item attribull="true" name="foobar" />
    </items>
    (...)
  </bar>
</foo>

我想制作以下文档,移动items节点并移除所有attribull属性。

<foo>
  <items>
    <item name="foo" />
    <item name="bar" />
    <item name="foobar" />
  </items>
  <bar>
    (...)
  </bar>
</foo>

我知道如何编写XSLT以将任何节点移动到其他位置,我知道如何编写XSLT以删除特定属性但是我不知道是否可以使用 XSLT(一次通过)。

有任何线索吗?

1 个答案:

答案 0 :(得分:2)

只需复制项目(此处通过默认递归规则),然后将<bar>与所有子项复制除项目。要删除属性的所有实例,只需添加一个空匹配规则:

<?xml version="1.0" encoding="UTF-8"?>
<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="@attribull" />

<xsl:template match="bar">
  <xsl:apply-templates select="items"/>

  <xsl:copy>
    <xsl:apply-templates select="@*|text()|*[not(self::items)]"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>