XSLT 2.0で便利になった機能(31) use-when属性

スタイルシートを作成するときはどんな構成にするでしょうか?私は納品するものでなくとも後で使うだろうというものは大体次のような構成にしています.
 
xxx_shell.xsl --- 以下の.xslをincludeする.
  xxx_main.xsl --- メインコントロールの処理
  xxx_param.xsl--- パラメータを記述
  xxx_global.xsl--- スタイルシート全体で使う変数を格納
  xxx_common.xsl--- 共通的なテンプレートを格納
  xxx_util.xsl --- 他のプロジェクトでも使えそうなユーティリティ的なテンプレートや関数
  xxx_yyyy.xsl --- 他は大体処理する要素グループ毎にまとめる.
  ...
 
ということで、xxx_shell.xslは全部xsl:includeで成り立っています.C/C++言語に#includeがあって、XSLTにもxsl:includeがあります.C/C++では、#ifdefや#ifndefで#includeをコントロールできます.ではXSLTはどうかというと、あまりはなばなしくないのですがあることはあるのです.それは、use-when属性です.例えば次のように使えます.
<xsl:include href="xxx_yyy.xsl" use-when="system-property('use.yyy.lib')='yes'"/>
<xsl:include href="xxx_zzz.xsl" use-when="not(system-property('use.yyy.lib')='yes')"/>
 
これでxxx_yyy.xslとxxx_zzz.xslのいずれかをJavaシステムプロパティのuse.yyy.libの値により排他的にincludeできます.use-whenの中はxsl:variableの値などはダメでした.Javaシステムプロパティは、antのビルドファイルの中で設定しています.
 
use-whenは制約が多いので使う機会は少ないと思いますが、覚えておいて損はありません.xsl:includeだけでなくどのXSLT要素にも使えます.