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.