Re: [xsl] [XSLT 2.0] Creating a changeable globally scoped variable?

Subject: Re: [xsl] [XSLT 2.0] Creating a changeable globally scoped variable?
From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
Date: Mon, 22 Mar 2004 10:06:11 +0000
Hi Roger,

> 2. Create a range variable with a sequence of values.  From reading the
> specs this seemed promising.  Here's an example of how this might work:
>
>    <xsl:template match="/">
>       <xsl:value-of select="for $i in (1 to 10) return (ex:print())"/>
>    </xsl:template>
>
>    <xsl:function ex:print">
>        <xsl:value-of select="$i"/>
>    </xsl:function>
>
> From reading the specs I got the impression that the range variable
> ($i) would have a scope over everything within "return (...)". In my
> example, within the return is a call to a function. I was thinking
> that the range variable's scope would extend to the ex:print
> function. Alas, it doesn't (unless there is a bug in SAXON).

The variable's scope is *lexically* within the return expression, so
you can use the variable reference $i within that expression, but you
can't use it elsewhere (such as the body of the function). The same is
true at the XSLT level: declaring a variable in one template does not
make it available in any other template, even those called from it.

If you just want to print the values 1 to 10 via a function, pass the
value of $i into the ex:print() function as a parameter:

<xsl:template match="/">
  <xsl:value-of select="for $i in (1 to 10) return (ex:print($i))"/>
</xsl:template>

<xsl:function name="ex:print">
  <xsl:param name="i" />
  <xsl:value-of select="$i"/>
</xsl:function>

But as others have said, you can't update a variable in XSLT, and
saying that you want to is usually a sign that you're approaching a
problem in an inappropriate way.

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/

Current Thread