Re: [xsl] Keys

Subject: Re: [xsl] Keys
From: Dimtre Novatchev <dnovatchev@xxxxxxxxx>
Date: Thu, 9 Sep 2004 21:21:49 +1000
On Wed, 8 Sep 2004 22:43:07 -0700, Karl J. Stubsjoen
<karl@xxxxxxxxxxxxxxxxxxxx> wrote:
> How do you manage this sort of key:
> <xsl:key name="attType"
> match="/root/*/xml/s:Schema/s:ElementType/s:AttributeType"
> use="/root/*[@name()]"/>
> 
> I am trying to create a "USE" on a specific node who's name can very so:
> 
> root/class
> root/house
> root/bird
> 
> This select works great:
> <xsl:for-each
> select="/root/*[name()=$TABLE_NAME]/xml/s:Schema/s:ElementType/s:AttributeTy
> pe">
> 
> Where $TABLE_NAME is a variable.

This can be done in a straight way and no variable reference is needed
in the xsl:key instruction.

Use:

 <xsl:key name="kAtt" match="attributeType"
   use="name(../../../..)"/>

and

     key('kAtt', '$vSomeName')

For example (namespaces from your example stripped intentionally):

This transformation:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
 
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:key name="kAtt" match="attributeType"
   use="name(../../../..)"/>

  <xsl:template match="/">
    <keyResults>
      <xsl:copy-of select="key('kAtt', 'a')"/>
      <xsl:copy-of select="key('kAtt', 'b')"/>
      <xsl:copy-of select="key('kAtt', 'c')"/>
    </keyResults>
  </xsl:template>
</xsl:stylesheet>

when applied on this source.xml:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
 
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:key name="kAtt" match="attributeType"
   use="name(../../../..)"/>

  <xsl:template match="/">
    <keyResults>
      <xsl:copy-of select="key('kAtt', 'a')"/>
      <xsl:copy-of select="key('kAtt', 'b')"/>
      <xsl:copy-of select="key('kAtt', 'c')"/>
    </keyResults>
  </xsl:template>
</xsl:stylesheet>

produces the wanted result:

<keyResults>
  <attributeType>attA-1</attributeType>
  <attributeType>attA-2</attributeType>
  <attributeType>attB-1</attributeType>
  <attributeType>attB-2</attributeType>
  <attributeType>attC-1</attributeType>
</keyResults>

Cheers,

Dimitre Novatchev.

Current Thread