XSLT 2.0で便利になった機能(42) mode属性

特に文書系なのですが、スタイルシートは手が込んでくるとやたらとモードを使って処理を切り回す場合があります.相手は同じ要素なのですが、xsl:templateのmode属性を変えて違った処理をしたいことが多々ある訳です.索引などがよい例かもしれません.私はXSLT1.0の知識しかなかったので、一つのスタイルシートでこのモード名の数がどんどん増加してしまいました.こんなときに覚えておきたいのがXSLT2.0で拡張されているmode属性の使用方法です.
 
■ xsl:templateのmodeには複数のモード名を指定できる.
 
XSLT1.0ではmodeには1つの名前しか記述できませんでした.これがテンプレートの数が増える原因です.モードごとにいくつも同じようなテンプレートを作っていませんか?XSLT2.0では、xsl:templateのmode属性はホワイトスペースで区切って複数のモード名を指定できます.
 
<xsl:template match="indexterm" mode="TEXT_ONLY MAKE_INDEX CHECK_CONTENT">
 
同じ処理をしているテンプレートがあったら、この方法でテンプレート数を減らすことができます.
 
■ 下位のテンプレートには、テンプレートが起動されたモードを#currentで指定できる.
 
ある要素については同じような処理をするのだけれど、下位のテンプレートの処理が違う場合はどうするの?大丈夫です次のようにコーディングできます.
 
<xsl:template match="indexterm" mode="TEXT_ONLY MAKE_INDEX CHECK_CONTENT">
    ...
    <xsl:apply-templates mode="#current"/>
    ...
</xsl:template>
 
#currentは、そのテンプレートが起動されたモードを引き継いで下位のテンプレートに渡してくれます.ですから、上記のようにxsl:templateのmode属性に複数のモード名が指定されていてもバッチリOKです.
 
■ どのモードでもOKの#all
 
<xsl:template match="indexterm" mode="#all">
 
と書けば、どのようなモード(xsl:apply-templateでmodeを指定しないときも含む)でもマッチしてくれます.あまり使い道があるかわかりませんが、全部のモードの処理を共通化できる場合は、モードを羅列する必要がありません.
 
■ デフォルトを示す#default
 
普通メインのスタイルシートには、mode属性を付けません.いわば「名前なしモード」です.これはデフォルトモードを示します.mode="#default"と書くのと同じことです.
 
XSLT2.0を使うようになったらぜひ以上の知識を活用したいものです.