閑話休題:テンポラリツリーをXSLT2.0で表す.

XSLT1.0から2.0へのスタイルシートの移行を始めると、次の点に迷います.
 
1. <xsl:variable>にas属性をつけるべきか?
2. <xsl:param>にrequired, as属性をつけるべきか?
 
XSLT2.0プロセッサはこれらの記述の有無には下位互換性がありますので、XSLT1.0の記述のままにしておいても良いのですが、そのままだとやはりXSLT2.0の特色を発揮できません.私は工数がないときはともかく、極力1.、2.はつけるようにしています.
 
さて、xs:stringやxs:integerのような簡単な型なら良いのですが、XSLT1.0のテンポラリツリーはどうなるのでしょうか?
 
<xsl:variable name="langs">
    <xsl:element name="lang">
        <xsl:text>en</xsl:text>
    </xsl:element>
    <xsl:element name="lang">
        <xsl:text>ja</xsl:text>
    </xsl:element>
</xsl:variable>
 
これらを引数として授受するとき、
 
<xsl:param name="prmTempLang" required="yes" as="document-node()"/>
 
としてやります.ではテンポラリツリー本体はどうするのでしょうか? 単純に
 
<xsl:variable name="langs" as="document-node()">
 
とすると次のようにコンパイルエラーが出てしまいます.
 
Error at xsl:variable on line NN column MM of test.xsl:
  XTTE0570: Required item type of value of variable $langs is document-node(); supplied
  value has item type element(lang, {http://www.w3.org/2001/XMLSchema}untyped)
 
確かに、<xsl:variable>の下の、sequence-constructorは<xsl:element>だけなので、そういわれればそのとおりです.ではどうする?
このようなときは、document-node()をsequenceとして返してくれる<xsl:document>使います.
 
<xsl:variable name="langs" as="document-node()">
    <xsl:document>
        <xsl:element name="lang">
            <xsl:text>en</xsl:text>
        </xsl:element>
        <xsl:element name="lang">
            <xsl:text>ja</xsl:text>
        </xsl:element>
    </xsl:document>
</xsl:variable>
 
<xsl:documet>は、かつて日の目を見なかったXSLT1.1のワーキングドラフトでは、新たな出力ファイルを作るもので、まるで別の機能でした.このXSLT1.1のワーキングドラフトの機能はXSLT2.0では<xsl:result-document>が行うようになっています.