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.h...@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. **** > > ** ** > > *Results* > > ====== Template 1 ======**** > > count(tree1)=2**** > > N1=1**** > > N2=2**** > > N3=3**** > > ====== Template 2 ======**** > > count(tree2)=3**** > > ** ** > > ** ** > > 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>**** > > ** ** > > </xsl:stylesheet>**** > > ===============================================================**** > > ** ** > > Thanks for any help,**** > > -kurt**** > > (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**** > > kurt.h...@truvenhealth.com > truvenhealth.com**** > > The Healthcare Business of Thomson Reuters is now > Truven Health Analytics. **** > > ** ** > -- Regards, Mukul Gandhi