Re: [xsl] Keys

Subject: Re: [xsl] Keys
From: Dimtre Novatchev <dnovatchev@xxxxxxxxx>
Date: Thu, 9 Sep 2004 22:37:41 +1000
Sorry, the source xml in the example should read:

<root>
  <a>
    <xml>
      <Schema>
        <ElementType>
          <attributeType>attA-1</attributeType>
        </ElementType>
      </Schema>
    </xml>
  </a>
  <b>
    <xml>
      <Schema>
        <ElementType>
          <attributeType>attB-1</attributeType>
        </ElementType>
      </Schema>
    </xml>
  </b>
  <c>
    <xml>
      <Schema>
        <ElementType>
          <attributeType>attC-1</attributeType>
        </ElementType>
      </Schema>
    </xml>
  </c>
  <b>
    <xml>
      <Schema>
        <ElementType>
          <attributeType>attB-2</attributeType>
        </ElementType>
      </Schema>
    </xml>
  </b>
  <a>
    <xml>
      <Schema>
        <ElementType>
          <attributeType>attA-2</attributeType>
        </ElementType>
      </Schema>
    </xml>
  </a>
</root>


On Thu, 9 Sep 2004 21:21:49 +1000, Dimtre Novatchev
<dnovatchev@xxxxxxxxx> wrote:
> 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