[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

xslt key used with a predicate of an xpath expression

Subject: xslt key used with a predicate of an xpath expression
From: "Tim Lebo" <timleboxslt@xxxxxxxxx>
Date: Fri, 24 Mar 2006 18:29:11 -0500
xslt key use
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

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2011 All Rights Reserved.