最初XPath2.0の例をいろいろ見ていて、ギョッとしたのが、if (...) then elseの式でした.御存知のように、XSLTの要素では、<xsl:if>は書けますが、<xsl:else>というのはなく、(XMLはタグが対応していなければならないので当たり前ですが...)実用的に条件を記述するのには、いつも<xsl:choose>を使わなければならなかったからです.
ですから、XSLT1.0から2.0に移行する際には、
<xsl:variable name="lang">
<xsl:choose>
<xsl:when test="string(@xml:lang)">
<xsl:value-of select="string(@xml:lang)"/>
<xsl:when>
<xsl:otherwise>
<xsl:value-of select="'en'"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:when test="string(@xml:lang)">
<xsl:value-of select="string(@xml:lang)"/>
<xsl:when>
<xsl:otherwise>
<xsl:value-of select="'en'"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
などというXSLT2.0から見ると「タコ」のようなコードがあると、一発で
<xsl:variable name="lang" as="xs:string" select="if (string(@lang)) then string(@lang) else 'en'">
と、喜び勇んで書き換えていたものでした.
if式は、必ずthenとelseを対で書かなければなりません.ここに書けるのは、仕様上ExprSingleですので、やろうとすれば、
<xsl:variable name="langAttr" as="xs:string" select="string(@xml:lang)"/>
<xsl:variable name="lang" as="xs:string" select="if (string($langAttr)) then if ($langAttr='ja-jp') then 'ja' else $langAttr else 'en'"/>
<xsl:variable name="lang" as="xs:string" select="if (string($langAttr)) then if ($langAttr='ja-jp') then 'ja' else $langAttr else 'en'"/>
などとネストもできてしまいます.<xsl:choose>を必至に使っていたのがウソのようです.でもあまりselect=""の中でifをネストをしてもかえって可読性が落ちてしまいますね.私は程ほどにしています.