The saxon:assign
instruction is used to change the value of a local or global variable that
has previously been declared using xsl:variable
(or xsl:param
).
The variable or parameter
must be marked as assignable by including the extra attribute
saxon:assignable="yes"
As with xsl:variable
, the name of the variable is given in the mandatory name attribute,
and the new value may be given either by an expression in the select
attribute, or by expanding
the content of the xsl:assign
element.
If the xsl:variable
element has an as
attribute, then the value is converted
to the required type of the variable in the usual way.
Example:
<xsl:variable name="i" select="0" saxon:assignable="yes"/>
<saxon:while test="$i < 10">
The value of i is <xsl:value-of select="$i"/>
<saxon:assign name="i" select="$i+1"/>
</saxon:while>
The saxon:assign
element itself does not allow an as
attribute. Instead,
it calculates the value of the variable as if as="item()*"
were specified. This means that
the result of the construct:
<saxon:assign name="a">London</saxon:assign>
is a single text node, not a document node containing a text node. If you want to create a document
node, use xsl:document
.
Note: Using saxon:assign
is cheating. XSLT is designed as
a language that is free of side-effects, which is why variables are not assignable.
Once assignment to variables is allowed, certain optimizations become impossible.
At present this doesn't affect Saxon, which generally executes the stylesheet
sequentially. However, there are some circumstances in which the order of execution
may not be quite what you expect, in which case saxon:assign
may show
anomalous behavior. In principle the saxon:assignable
attribute is designed
to stop Saxon doing optimizations that cause such anomalies, but you can't always rely
on this.