## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

No credit card required

# Determining Set Equality by Value

## Problem

You need to determine if the nodes in one node set are equal (by value) to the nodes in another node set (ignoring order).

## Solution

This problem is slightly more subtle than it appears on the surface. Consider an obvious solution that works in many cases:

```<xsl:template name="vset:equal-text-values">
<xsl:param name="nodes1" select="/.."/>
<xsl:param name="nodes2" select="/.."/>
<xsl:choose>
<!--Empty node-sets have equal values -->
<xsl:when test="not(\$nodes1) and not(\$nodes2)">
<xsl:value-of select="true(  )"/>
</xsl:when>
<!--Node sets of unequal sizes can not have equal values -->
<xsl:when test="count(\$nodes1) != count(\$nodes2)"/>
<!--If an element of nodes1 is present in nodes2 then the node sets
have equal values if the node sets without the common element have equal
values -->
<xsl:when test="\$nodes1[1] = \$nodes2">
<xsl:call-template name="vset:equal-text-values">
<xsl:with-param name="nodes1" select="\$nodes1[position(  )>1]"/>
<xsl:with-param name="nodes2"
select="\$nodes2[not(. = \$nodes1[1])]"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:template>```

We have chosen a name for this equality test to emphasize the context in which it should be applied. That is when value equality indicate string-value equality. Clearly, this template will not give the correct result if equality is based on attributes or criteria that are more complex. However, this template has a more subtle problem. It tacitly assumes that the ...

## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

No credit card required