L'ordre d'évaluation n'est, en général, pas garanti, sauf lorsque de telles garanties découlent de la dépendance des expressions. Par exemple, l'ordre d'évaluation n'est pas garanti :
<xsl:variable name="foo" value="123" />
<xsl:variable name="bar" value="456" />
<xsl:variable name="baz" value="$foo + $bar" />
<xsl:variable name="dummy" value="42 div 0" />
<xsl:template match="/">
<xsl:value-of select="$baz"/>
</xsl:template>
Ici, il est certain que baz
sera évaluée à un moment donné avant d'être émise - peut-être juste avant d'être émise, peut-être au démarrage, peut-être quelque part entre les deux - et cette foo
y bar
sera évaluée avant baz
- mais l'ordre relatif d'évaluation des foo
y bar
n'est pas défini.
dummy
est un cas intéressant. Il n'est utilisé nulle part et pourrait donc être complètement omis, mais, si ma compréhension de la spécification est correcte, le processeur doit néanmoins soulever une erreur comme s'il avait été évalué. Le moment où il le fait n'est pas important, car il n'y a aucun moyen de le savoir à l'intérieur de XSLT - donc dummy
sera évaluée à un moment indéterminé de l'exécution (ce peut être la première chose qu'elle fait, ou la dernière après que toutes les sorties ont déjà été générées), mais il est garanti que la transformation échouera avec une erreur.
Tout cela concerne XSLT et XPath 1.0. Dans la version 2.0, la situation est plus souple - l'évaluation n'est même pas obligatoire ; si le processeur peut obtenir un résultat valide en ignorant l'évaluation de certaines expressions qui, sinon, entraîneraient une erreur, il a l'autorisation générale de le faire.