XSLT2.0で便利になった機能(8) if () then elseを使う

最初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>
 
などという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:choose>を必至に使っていたのがウソのようです.でもあまりselect=""の中でifをネストをしてもかえって可読性が落ちてしまいますね.私は程ほどにしています.