Xslt XSL-如何比较两组节点?
我有以下数据Xslt XSL-如何比较两组节点?,xslt,xslt-1.0,Xslt,Xslt 1.0,我有以下数据 <parent> <child>APPLES</child> <child>APPLES</child> <child>APPLES</child> </parent> <parent> <child>APPLES</child> <child>BANANA</child> <
<parent>
<child>APPLES</child>
<child>APPLES</child>
<child>APPLES</child>
</parent>
<parent>
<child>APPLES</child>
<child>BANANA</child>
<child>APPLES</child>
</parent>
苹果
苹果
苹果
苹果
香蕉
苹果
有没有比较父节点的简单方法?或者我必须在for-each中嵌套for-each并使用position()手动测试每个子级吗 XSLT 2.0具有此功能,因此您可以编写模板
<xsl:template match="parent[deep-equal(., preceding-sibling::parent[1])]">...</xsl:template>
然后按如下方式使用它:
<xsl:template match="parent">
<xsl:variable name="this-sig">
<xsl:apply-templates select="." mode="sig"/>
</xsl:variable>
<xsl:variable name="pre-sig">
<xsl:apply-templates select="preceding-sibling::parent[1]" mode="sig"/>
</xsl:variable>
<!-- now compare e.g. -->
<xsl:choose>
<xsl:when test="$this-sig = $pre-sig">...</xsl:when>
<xsl:otherwise>...</xsl:otherwise>
</xsl:choose>
</xsl:template>
...
...
对于更复杂的内容,您可能需要改进模板的实现,计算“签名”字符串,您可能需要搜索web,我相信Dimitre Novatchev已经发布了关于早期类似问题的解决方案。您想要什么输出?在我的数据中有30多个节点,我将使用。我想知道当前父节点的子节点何时与前一个父节点不同。例如,它可以是,X X X,然后X X X,然后Y X Y。我想知道什么时候会发生这种情况。感谢您的响应,但不幸的是,我仅限于XSLT 1.0。在这种情况下,您必须自己实现一个等价物,通过递归模板将两个节点作为其参数进行比较。XPath 2.0 deep-equal()的规范可能被证明是有用的指南。@DerekHo,我已经添加了一些关于如何与XSLT 1.0.Genius进行比较的建议!没有考虑将父对象连接成一个平面字符串。
<xsl:template match="parent">
<xsl:variable name="this-sig">
<xsl:apply-templates select="." mode="sig"/>
</xsl:variable>
<xsl:variable name="pre-sig">
<xsl:apply-templates select="preceding-sibling::parent[1]" mode="sig"/>
</xsl:variable>
<!-- now compare e.g. -->
<xsl:choose>
<xsl:when test="$this-sig = $pre-sig">...</xsl:when>
<xsl:otherwise>...</xsl:otherwise>
</xsl:choose>
</xsl:template>