blob: 247042a40f176b7543d19e57d3f76b961c3f70f8 [file] [log] [blame]
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Xalan 2.6 contained in the Sun JDK 1.5 u12 and newer has issues with
evaluating grouping nodes according the Muenchian Method (by Steve Muench),
where nodes are stored in a key data structure for the group key, and later
a group start is checked by checking for the first node retrieved for a key.
The nodes are compared using a set union, where the size of the set should
be 1 when the nodes are identical, and different to 1 when the nodes are
different.
The issue with Xalan 2.6 as part of the JDK is, that it does not evaluate the
expression "count(.|key('props', subexpr)[1])" correctly. It always returns
"1". If the argument expression of count() is stored in a variable first,
and the variable is used as argument for count(), then everything works fine.
-->
<xsl:key name="props" match="c" use="d/e"/>
<xsl:template match="a">
Working (by replacing the count() argument with a variable):
<xsl:for-each select="b">
<xsl:for-each select="c">
<xsl:variable name="tNodeSet" select=".|key('props', d/e)[1]"/>
<xsl:for-each select="$tNodeSet">
Node <xsl:value-of select="d/e/@attr"/>;
</xsl:for-each>
count = <xsl:value-of select="count($tNodeSet)"/>
</xsl:for-each>
---------
</xsl:for-each>
Not working in the 2nd loop iteration (by using the union expression as count() argument):
<xsl:for-each select="b">
<xsl:for-each select="c">
<!-- We replaced the variable "tNodeSet" by the related union expression.
The for-each loop will work correctly, but the count() will
always return "1" instead of first "1" and then "2".
-->
<xsl:for-each select=".|key('props', d/e)[1]">
Node <xsl:value-of select="d/e/@attr"/>;
</xsl:for-each>
count = <xsl:value-of select="count(.|key('props', d/e)[1])"/>
</xsl:for-each>
---------
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>