XSLT1.0から2.0へのスタイルシートの移行を始めると、次の点に迷います.
1. <xsl:variable>にas属性をつけるべきか?
2. <xsl:param>にrequired, 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: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)
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: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>