XSL - 如何比较2组节点?

时间:2013-08-28 08:21:16

标签: xslt xslt-1.0

我有以下数据

<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()手动测试每个子项?

1 个答案:

答案 0 :(得分:2)

XSLT 2.0具有函数http://www.w3.org/TR/2013/CR-xpath-functions-30-20130521/#func-deep-equal,因此您可以编写模板

<xsl:template match="parent[deep-equal(., preceding-sibling::parent[1])]">...</xsl:template>

处理那些与前一个兄弟parent相等的parent个元素。

如果您想使用XSLT 1.0,那么对于具有纯文本内容的子元素序列的简单情况,它应该足以编写模板

<xsl:template match="parent" mode="sig">
  <xsl:for-each select="*">
    <xsl:if test="position() &gt; 1">|</xsl:if>
    <xsl:value-of select="."/>
  </xsl:for-each>
</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>

对于更复杂的内容,您需要优化计算“签名”字符串的模板的实现,您可能想要搜索网络,我相信Dimitre Novatchev已经在之前的类似问题上发布了解决方案。