根据三个属性排除节点
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
。
这不是与没有前一个兄弟节点的节点相同的东西,该兄弟节点具有相同的id
和version
和[组合=13=](所有三个都在一个节点中)。
我相信在此处使用 xsl:for-each-group
会是一个更好的部署策略。
我正在尝试使用以下代码从文档中仅复制所有节点一次:
<?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
。
这不是与没有前一个兄弟节点的节点相同的东西,该兄弟节点具有相同的id
和version
和[组合=13=](所有三个都在一个节点中)。
我相信在此处使用 xsl:for-each-group
会是一个更好的部署策略。