Re: [xsl] scoping inside a select statement

Subject: Re: [xsl] scoping inside a select statement
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Wed, 12 Feb 2003 18:32:51 -0500
Hey Simon,

At 05:45 PM 2/12/2003, you wrote:
Why does this DWIM:
 <xsl:variable name="foobar" select="@name"/>
 <xsl:value-of select="document('inst.xml')//*[boolean(name() = $foobar)]"/>

and this doesn't:
 <xsl:value-of select="document('inst.xml')//*[boolean(name() = @name)]"/>

... or perhaps I should say, how do I scope @name inside a select to refer to the @name attribute of the context node outside the select, instead of whatever it's referring to here (... an attribute named @name in the context node inside the select?)

There is an XSLT function, current(), that returns the current node (the node matched by the template or selected by a for-each), so when the context changes in a long XPath, you can still get to it.

<xsl:value-of select="document('inst.xml')//*[name() = current()/@name]"/>

(BTW notice that boolean() function isn't needed: "" already returns a Boolean and the fact that this is a predicate expression would coerce it to one even if it weren't.)

Another technique, sometimes preferable, is to bind your current node to a variable and refer to that.


Also if you're wondering about the unnecessary boolean() I've decided to use it for syntactic safety to protect myself from numeric result s;-)

But when will the expression "name() = current()/@name" return a number? And even if it were ... since it's a predicate expression it'd be coerced into a Boolean anyway. :-)

Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.      
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
  Mulberry Technologies: A Consultancy Specializing in SGML and XML

XSL-List info and archive:

Current Thread