根据三个属性排除节点

Excluding nodes based on three attributes

我正在尝试使用以下代码从文档中仅复制所有节点一次:

<?xml version="1.0"?>

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

<xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()[not(@id = preceding-sibling::node()/@id and @version = preceding-sibling::node()/@version and @lang = preceding-sibling::node()/@lang)]"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

然而,此代码使具有相同 ID 的每个 node() 仅被复制一次,无论它们是否具有相同的语言和版本。

所以如果 id="2" version="2" 和 lang="en" 的节点在 id="2" version="1" 和 lang=[=19= 的节点之上], 版本1的节点没有被复制。

为什么只评估一个条件?

注意表达式:

node()[not(@id = preceding-sibling::node()/@id and @version = preceding-sibling::node()/@version and @lang = preceding-sibling::node()/@lang)]

选择不具有相同 id 的前同级节点,并且不具有具有相同 version 的前同级节点,并且不具有前同级节点的任何节点同样的lang

不是与没有前一个兄弟节点的节点相同的东西,该兄弟节点具有相同的idversion和[组合=13=](所有三个都在一个节点中)。

我相信在此处使用 xsl:for-each-group 会是一个更好的部署策略。