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>