首页 > 解决方案 > XSLT - 当前节点等于前一个节点时删除节点

问题描述

我需要为包含以下格式的 xml 编写 XSLT。

<books>
<book>
 <a>name</a>
 <a>name</a>
 <b>name</b>
 <b>name</b>
</book>
</books>

在某些情况下,我需要消除重复的子节点。

  1. 只有当(当前节点 == 前一个节点)才应该将其删除。

即..如果前一个节点(元素)是<a> 并且当前节点(元素)也是<a>,那么应该删除一个节点。

上面的输出是,

`<a>name</a>`

`<b>name</b>`

请帮我这样做。

标签: htmlxmlxslt

解决方案


在 XSLT 2 或 3 中,您可以通过节点名称轻松地将相邻的兄弟元素分组,for-each-group select="*" group-adjacent="node-name()"并简单地输出每个组中的第一项(等于上下文项.):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="book">
      <xsl:copy>
          <xsl:for-each-group select="*" group-adjacent="node-name()">
              <xsl:copy-of select="."/>
          </xsl:for-each-group>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/6qVRKw4/1


推荐阅读