xsl-list
[Top] [All Lists]

Re: Keys

2004-09-09 05:37:41
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(_at_)gmail(_dot_)com> wrote:
On Wed, 8 Sep 2004 22:43:07 -0700, Karl J. Stubsjoen
<karl(_at_)meetscoresonline(_dot_)com> wrote:
How do you manage this sort of key:
<xsl:key name="attType"
match="/root/*/xml/s:Schema/s:ElementType/s:AttributeType"
use="/root/*[(_at_)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.



<Prev in Thread] Current Thread [Next in Thread>