What I've never quite understood is how to wrap this into a
conditional.
Based on http://www.dpawson.co.uk/xsl/sect2/N8090.html#d9711e895
example, would this be correct for wrapping an assignment in
only if a
variable was passed in, otherwise using the default?
<xsl:variable name="n">
<!--Conditionally instantiate a value to be assigned to
the variable
-->
<xsl:choose>
<xsl:when test=="//test1/somevalue1">
<xsl:variable name="num1" select="//test1/somevalue1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="20"/><!-- ...or a "20" -->
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
The problem with this code is that you get a copy of the nodes in
somevalue1. If you want the variable to hold references to the actual nodes,
a conditional assignment is difficult to achieve in XSLT 1.0. It becomes
easy in 2.0:
<xsl:variable name="n" select="if (COND) then //a/b/c else 20"/>
In 1.0 you can sometimes solve the problem with
<xsl:variable name="n" select="//a/b/c[COND] | //a/b/d[not(COND)]"/>
Michael Kay