RE: [xsl] Using XSLT's key() function while context in secondary document?

Subject: RE: [xsl] Using XSLT's key() function while context in secondary document?
From: "Scott Trenda" <Scott.Trenda@xxxxxxxx>
Date: Tue, 19 Feb 2008 11:13:04 -0600
Alternatively, you could do the same with a little less code:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
  <xsl:key name="chnam" match="Chnl" use="@ID" />
  <xsl:template match="/">
    <Urmel>
      <xsl:for-each select="key('chnam', document('s.xml')//Channel)">
        <p><xsl:value-of select="@ID"/> this works</p>
      </xsl:for-each>
    </Urmel>
  </xsl:template>
</xsl:stylesheet>

Assuming you're not doing any other processing on the s.xml//Channel
nodes, that is. If not, then with the code above, you shouldn't need to
change the context document in the first place.

~ Scott


-----Original Message-----
From: Michael Ludwig [mailto:mlu@xxxxxxxxxxxxx]
Sent: Tuesday, February 19, 2008 5:48 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] Using XSLT's key() function while context in
secondary document?

Michael Kay schrieb:
>> Is there a way to direct the key() function back to the
>> principal document while the context node is located in
>> another document?
>>
>
> In XSLT 2.0, use the third argument of key() to tell it which document
> to search. In 1.0, you need to change context to that document, which
> you can do using xsl:for-each.
>
> Michael Kay

Thanks a lot! So the solution involving the documents given in my
original post goes like this:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
  <xsl:variable name="principal-doc" select="/"/>
  <xsl:key name="chnam" match="Chnl" use="@ID"/>
  <xsl:template match="/">
   <Urmel>
    <xsl:for-each select="document('s.xml')//Channel">
     <xsl:variable name="cur" select="."/>
     <xsl:for-each select="$principal-doc"><!-- change context -->
      <p><xsl:value-of select="key('chnam', $cur)"/> this works</p>
     </xsl:for-each>
     <p><xsl:value-of select="key('chnam', $cur)"/>this doesn't</p>
    </xsl:for-each>
   </Urmel>
  </xsl:template>
</xsl:stylesheet>

Michael Ludwig

Current Thread