XSLT2.0で便利になった機能(1) tunnelパラメータ

XSL2.0で便利になった機能をいくつか紹介しようと思います.ただし私は体系的に学んだわけではないので、実際に使ってみて便利と実感したものを順不同という形です.
最初はトンネルパラメータです.文書処理のスタイルシートを書いていると、ブロックレベルの要素、インラインレベルの要素が入れ子になってコンテンツモデルとなっている場合が多々あります.たいてい各要素毎に、
 
<xsl:template match="xxx">
  ...
</xsl:template>
 
というような形でテンプレートを書きますが、各テンプレートにパラメータを渡したい場合が出てきます.こうした場合、そのパラメータを使用するテンプレートに到着するまで、すべてのテンプレートで、
 
<xsl:param name="prmLang" as="xs:string" required="yes"/>
 
などという形でもれなくテンプレートにパラメータを定義し、下位のテンプレートを呼ぶ場合には、必ず
 
<xsl:apply-templates>
  <xsl:with-param name="prmLang" select="$prmLang"/>
</xsl:apply-templates>
 
と受け渡してやらねばなりませんでした.トンネルパラメータを使えば、
 
<xsl:with-param name="prmLang" tunnel="yes" select="'en'"/>
 
というtunnel="yes"で「トンネルの入り口」が作られ、途中の<xsl:param>や<xsl:with-param>の記述をしなくても、最終的に必要なテンプレートで
 
<xsl:param name="prmLang" as="xs:string" tunnel="yes" required="yes"/>
 
と書いてやれば、ここが「トンネルの出口」となり、パラメータを$prmLangとして参照できます.この機能は、途中のパラメータ記述を省略できるので大変ありがたいものです.スタイルシートのコーディング途中でのパラメータの仕様変更も楽にできます.
現在、XSLT1.0で書いたパラメータの授受をトンネル化していますが、Saxon 9でうまく動いてくれています.この調子なら、主要なテンプレートのパラメータをすべてトンネルで記述できそうです.(いったんXSLT1.0でパラメータに書いてしまっているので手間はかかりますが...)
なお、tunnel="yes"を指定したパラメータと、tunnel="no"もしくはtunnel属性を省略したパラメータは別物として扱われます.name="prmLang"で同じであっても、tunnel="yes"とtunnel="no"のパラメータは区別されるということです.