I feel this is not a bug. My reading of XSLT 1.0 spec says, that a xsl:key declaration (or a set of them) within a stylesheet are applicable only to one document.

Two different nodesets (constructed from a RTF) are conceptually two different documents, therefore as per above notion they cannot share xsl:key declarations.

On Wed, Oct 16, 2013 at 12:18 AM, Hall, Kurt (Truven Health) <kurt.hall@truvenhealth.com> wrote:

I suspect that I have found a bug pertaining to multiple key() function calls that share a common xsl:key but occur in different templates.† Both key() calls are operating on results-tree-fragments that Iíve turned into nodesets with the xalan:nodeset() extension.

When the calls are in different templates the second occurance of key() doesnít return any results.† If I combine template1 and template2 into a single template then I get correct results for both key() calls.† I have worked around the issue by cloning the xsl:key (key2) and no longer reusing them.

Iím using Xalan 2.7.1.


====== Template 1 ======





====== Template 2 ======


Test Code:


<?xml version="1.0"† encoding = "ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xalan" exclude-result-prefixes="xalan">

† <xsl:key name="key1" match="*" use="text()"/>

† <xsl:key name="key2" match="*" use="text()"/>

† <xsl:template match="/">

††††† <xsl:call-template name="template1"/>

††††† <xsl:call-template name="template2"/>

††††† <xsl:call-template name="template3"/>

† </xsl:template>

† <xsl:template name="template1">

††††† <xsl:message>====== Template 1 ======</xsl:message>

††††† <xsl:variable name="rtf1"><N1>1</N1><N2>2</N2></xsl:variable>

††††† <xsl:variable name="tree1" select="xalan:nodeset( $rtf1)"/>

††††† <xsl:message>count(tree1)=<xsl:value-of select="count( $tree1/*)"/></xsl:message>

††††† <xsl:variable name="uniqNodes" select="$tree1/*[generate-id() = generate-id( key( 'key1', text()))]"/>

††††† <xsl:for-each select="$uniqNodes">

††††††† <xsl:message><xsl:value-of select="local-name()"/>=<xsl:value-of select="text()"/></xsl:message>

††††† </xsl:for-each>

† </xsl:template>

† <xsl:template name="template2">

††††† <xsl:message>====== Template 2 ======</xsl:message>

††††† <xsl:variable name="rtf2"><N4>4</N4><N5>5</N5><N6>6</N6></xsl:variable>

††††† <xsl:variable name="tree2" select="xalan:nodeset( $rtf2)"/>

††††† <xsl:message>count(tree2)=<xsl:value-of select="count( $tree2/*)"/></xsl:message>

††††† <!-- ************† CHANGE FOLLOWING FROM key1 to key2 ************* -->

††††† <xsl:variable name="uniqNodes" select="$tree2/*[generate-id() = generate-id( key( 'key1', text()))]"/>

††††† <!-- ************************************************************** -->

††††† <xsl:for-each select="$uniqNodes">

††††††††† <xsl:message><xsl:value-of select="local-name()"/>=<xsl:value-of select="text()"/></xsl:message>

††††† </xsl:for-each>

† </xsl:template>



Thanks for any help,


(This is my first post to the user-group so forgive me if Iím not following proper protocol)

Kurt Hall
Principal Engineer

Truven Health Analytics

Phone: 303-486-9161


The Healthcare Business of Thomson Reuters is now
Truven Health Analytics.

Mukul Gandhi