|
Subject: RE: [xsl] xslt key used with a predicate of an xpath expression From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Fri, 24 Mar 2006 23:57:19 -0000 |
<xsl:value-of select="concat('The @hex of that object means color ',
$colors/color[@hex=key('objects',idref)/@hex],
' (THIS DOES NOT WORK BUT I WANT IT
TO.)',$NL)"/>
"idref" is a relative path expression that means child::idref. The context
node is a <color> element, so it looks for a child of the color element
named idref, but there is none.
Moreover, the key function searches the document containing the context
node. But the color element is in a different document from the one you want
to search.
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: Tim Lebo [mailto:timleboxslt@xxxxxxxxx]
> Sent: 24 March 2006 23:29
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] xslt key used with a predicate of an xpath expression
>
> Hello,
>
> Lines 20-22 of the following xsl script do not work as I'd hoped.
> A way to get what I'd hoped is on lines 25-28.
>
> Is the key used in 20-22 passed directly to 'xpath' before being
> evaluated by 'xslt'?
> Is there a way to accomplish this without creating an extra variable
> as in the solution on 25-28?
>
> I think it is too hard to explain the problem in English, so please
> excuse my terse canonical description. If you would like more of a
> description, please ask.
>
> Regards,
> Tim Lebo
>
>
> ======== XML input =========
> <?xml version="1.0" encoding="UTF-8"?>
> <root>
> <object id="obj1" colorhex="#ffffff">
> </object>
> <object id="obj2" colorhex="#000000">
> </object>
> <object id="obj3" colorhex="#ffffff">
> </object>
> <thing>
> <idref>obj1</idref>
> </thing>
> </root>
>
>
> ======== XSLT attempt ========
> 1 <?xml version="1.0"?>
> 2 <xsl:transform
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
> 3 <xsl:output method="text"/>
> 4
> 5 <xsl:variable name="colors">
> 6 <color hex="#ffffff">White</color>
> 7 <color hex="#000000">Black</color>
> 8 </xsl:variable>
> 9
> 10 <xsl:key name="objects" match="object" use="@id"/>
> 11
> 12 <xsl:template match="/">
> 13 <xsl:apply-templates select="root/thing"/>
> 14 </xsl:template>
> 15
> 16 <xsl:template match="thing">
> 17 <xsl:value-of select="concat('This thing refers to object
> with @id ',idref,$NL)"/>
> 18 <xsl:value-of select="concat('The object with that id has
> @colorhex = ',
> 19
> key('objects',idref)/@colorhex,$NL)"/>
> 20 <xsl:value-of select="concat('The @hex of that object means
> color ',
> 21
> $colors/color[@hex=key('objects',idref)/@hex],
> 22 ' (THIS DOES NOT WORK BUT I
> WANT IT TO.)',$NL)"/>
> 23
> 24 <xsl:comment> The following accomplishes the desired output
> </xsl:comment>
> 25 <xsl:variable name="tempvar"
> select="key('objects',idref)/@colorhex"/>
> 26 <xsl:value-of select="concat('Value of undesireable variable
> is ',$tempvar,$NL)"/>
> 27 <xsl:value-of select="concat('The round-about way to get the
> color meaning is ',
> 28
> $colors/color[@hex=$tempvar],$NL)"/>
> 29 </xsl:template>
> 30
> 31 <xsl:variable name="NL">
> 32 <xsl:text>
> 33 </xsl:text>
> 34 </xsl:variable>
> 35
> 36 </xsl:transform>
>
>
>
> ======= XSLT without line numbers so you can run it yourself ======
> <?xml version="1.0"?>
> <xsl:transform
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
> <xsl:output method="text"/>
>
> <xsl:variable name="colors">
> <color hex="#ffffff">White</color>
> <color hex="#000000">Black</color>
> </xsl:variable>
>
> <xsl:key name="objects" match="object" use="@id"/>
>
> <xsl:template match="/">
> <xsl:apply-templates select="root/thing"/>
> </xsl:template>
>
> <xsl:template match="thing">
> <xsl:value-of select="concat('This thing refers to object with @id
> ',idref,$NL)"/>
> <xsl:value-of select="concat('The object with that id has
> @colorhex = ',
> key('objects',idref)/@colorhex,$NL)"/>
> <xsl:value-of select="concat('The @hex of that object means color ',
>
> $colors/color[@hex=key('objects',idref)/@hex],
> ' (THIS DOES NOT WORK BUT I WANT IT
> TO.)',$NL)"/>
>
> <xsl:comment> The following accomplishes the desired output
> </xsl:comment>
> <xsl:variable name="tempvar"
> select="key('objects',idref)/@colorhex"/>
> <xsl:value-of select="concat('Value of undesireable variable is
> ',$tempvar,$NL)"/>
> <xsl:value-of select="concat('The round-about way to get the color
> meaning is ',
> $colors/color[@hex=$tempvar],$NL)"/>
> </xsl:template>
>
> <xsl:variable name="NL">
> <xsl:text>
> </xsl:text>
> </xsl:variable>
>
> </xsl:transform>
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] xslt key used with a predicat, Tim Lebo | Thread | Re: [xsl] xslt key used with a pred, Tim Lebo |
| [xsl] xslt key used with a predicat, Tim Lebo | Date | Re: [xsl] xslt key used with a pred, Tim Lebo |
| Month |