RE: [xsl] XPath predicate test and parameter problem

Subject: RE: [xsl] XPath predicate test and parameter problem
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Tue, 30 Sep 2003 18:10:35 +0100
because you don't have any states called '$st'. Try removing the quotes.

select="row[state=$st]/city"

(Perhaps you are imagining that variables in XPath are macros,
implemented using textual substitution? They aren't: they are regular
values: you can use a variable reference anywhere you can use an
expression, and nowhere else).

Michael Kay



> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> cknell@xxxxxxxxxx
> Sent: 30 September 2003 17:42
> To: XSL-List@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] XPath predicate test and parameter problem
> 
> 
> This is making me crazy. I can't figure out where I'm failing.
> 
> Given this data document:
> <?xml version="1.0" encoding="UTF-8" ?>
> <rowset>
>  <row>
>   <city>Des Moines</city>
>   <state>IA</state>
>  </row>
>  <row>
>   <city>Pittsburgh</city>
>   <state>PA</state>
>  </row>
>  <row>
>   <city>Milwaukee</city>
>   <state>WI</state>
>  </row>
> </rowset>
> 
> Why does this stylesheet produce the output "Milwaukee",
> <?xml version="1.0" encoding="UTF-8" ?>
> <xsl:stylesheet version="1.0" 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
>  <xsl:output method="xml" indent="yes" encoding="UTF-8" />
> 
>  <xsl:template match="/">
>   <xsl:apply-templates select="rowset">
>    <xsl:with-param name="st" select="'WI'" />
>   </xsl:apply-templates>
>  </xsl:template>
> 
>  <xsl:template match="rowset">
>   <xsl:param name="st" />
>   <xsl:value-of select="row[state='WI']/city" />  </xsl:template>
> 
> </xsl:stylesheet>
> 
> and this one, only '<?xml version="1.0" encoding="UTF-8" ?>',
> 
> <?xml version="1.0" encoding="UTF-8" ?>
> <xsl:stylesheet version="1.0" 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
>  <xsl:output method="xml" indent="yes" encoding="UTF-8" />
> 
>  <xsl:template match="/">
>   <xsl:apply-templates select="rowset">
>    <xsl:with-param name="st" select="'WI'" />
>   </xsl:apply-templates>
>  </xsl:template>
> 
>  <xsl:template match="rowset">
>   <xsl:param name="st" />
>   <xsl:value-of select="row[state='$st']/city" />  </xsl:template>
> 
> </xsl:stylesheet>
> 
> To save you the trouble of minutely examining the two, the 
> difference is that in the one that doesn't work the way I 
> think it should, I use the value of the parameter to test the 
> content of the "state" element, where in the one that 
> produces the output I want, I use the literal string 'WI'.
> 
> Thanks.
> 
> 
> -- 
> Charles Knell
> cknell@xxxxxxxxxx - email
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread