I don't have the solution you asked for but I can suggest this. You can compare sets directly without looping. If you ask whether a node is equal to a node set you get true if there exists in that set a node whose string value is the same as the one of the single node. If you test whether they are not equal then you test that at least one node in the set does not equal that of the single node. You can also test whether no nodes are equal using not function.
Examples:
Use this data
Code:
<data>
<items>
<item id="id1">Item One</item>
<item id="id2">Item Two</item>
<item id="id3">Item Three</item>
<item id="id4">Item Four</item>
</items>
<target1 id="id3"/>
<target2 id="id5"/>
</data>
Run with this stylesheet:
Code:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/"><xsl:text>#x0a;</xsl:text>
target1/@id = items/item/@id: <xsl:value-of select="data/target1/@id = data/items/item/@id"/><xsl:text>#x0a;</xsl:text>
target1/@id != items/item/@id: <xsl:value-of select="data/target1/@id != data/items/item/@id"/><xsl:text>#x0a;</xsl:text>
not(target1/@id = items/item/@id): <xsl:value-of select="not(data/target1/@id = data/items/item/@id)"/><xsl:text>#x0a;</xsl:text>
*****************
target2/@id = items/item/@id: <xsl:value-of select="data/target2/@id = data/items/item/@id"/><xsl:text>#x0a;</xsl:text>
target2/@id != items/item/@id: <xsl:value-of select="data/target2/@id != data/items/item/@id"/><xsl:text>#x0a;</xsl:text>
not(target2/@id = items/item/@id): <xsl:value-of select="not(data/target2/@id = data/items/item/@id)"/><xsl:text>#x0a;</xsl:text>
</xsl:template>
</xsl:stylesheet>
Joe (MVP - xml)