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() > 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 已经在早期的类似问题上发布了解决方案。