saxon:assign instruction is used to change the value of a 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 with value
Permitted parent elements: any XSLT element whose content model is sequence-constructor; any literal result element
The name of the variable
The new value may be given either by an expression in the
This instruction works only with global variables. It should be regarded as deprecated, and may be withdrawn completely at some time in the future, since it is incompatible with many of the optimizations that Saxon now performs.
A better approach to the problem of updateable variables, based on the theory of monads in the functional programming literature, has been described by Dimitre Novatchev in section 3.6 of his paper Functional programming in XSLT using the FXSL library. This approach does not require any XSLT extensions, and the constructs it uses are implemented efficiently in Saxon.
xsl:variable element has an
as attribute, then the value
is converted to the required type of the variable in the usual way.
saxon:assign element itself does not allow an
Instead, it calculates the value of the variable as if
specified. This means that the result of the construct:
is a single text node, not a document node containing a text node. If you want to create a document node, use xsl:document.
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
saxon:assignable attribute is designed to stop Saxon doing optimizations
that cause such anomalies, but you can't always rely on this.