xsl-list
[Top] [All Lists]

RE: XPath predicate test and parameter problem

2003-09-30 10:10:35
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(_at_)lists(_dot_)mulberrytech(_dot_)com 
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of 
cknell(_at_)onebox(_dot_)com
Sent: 30 September 2003 17:42
To: XSL-List(_at_)lists(_dot_)mulberrytech(_dot_)com
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(_at_)onebox(_dot_)com - 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