# saxon:assign

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 &lt; 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.

Expand | Up Next