あるウェブページfoo.htmlでは、foo.cssという外部CSSスタイルシートを利用し、そのウェブページの補足ページbar.htmlにおいては、foo.css、及び、bar.cssの二つのCSSスタイルシートを利用するというケースがあるとします。
foo.htmlは、foo.xsl内の次のようなXSLTテンプレートによってlink要素が出力されています。
<!-- foo.xsl内 -->
<xsl:template name="CSS">
<link rel="stylesheet" href="foo.css" />
</xsl:template>
bar.htmlには、foo.cssの他にbar.cssも埋め込みたいので、このテンプレートを次のように「上書き」しました。
<!-- bar.xsl内 -->
<xsl:import href="foo.xsl" />
<xsl:template name="CSS">
<link rel="stylesheet" href="foo.css" />
<link rel="stylesheet" href="bar.css" />
</xsl:template>
しかしこれはテンプレートを一から再定義しているに過ぎません。
しかし結果ツリーフラグメントをグローバル変数にバインドする方法なら、インポートした側で結果ツリーフラグメントを拡張する事が出来ます。
<!-- foo.xsl内 -->
<xsl:variable name="CSS">
<link rel="stylesheet" href="foo.css" />
</xsl:variable>
<!-- bar.xsl内 -->
<xsl:import href="foo.xsl" />
<xsl:variable name="CSS">
<xsl:copy-of select="$CSS" />
<link rel="stylesheet" href="bar.css" />
</xsl:variable>
グローバル変数の場合、内容が最初に一度だけ評価され、内部ではまだ自分自身を参照する事が出来ませんが、それらを利用しています。
インポート優先順位の低いグローバル変数を参照する場合、エラーになるともならないとも書かれていないというだけで、何と言うかグレーゾーンなんですけどね。
テンプレートの拡張には、xsl:apply-imports要素があるではないかと思われるかもしれません。しかしこれは名前付きテンプレートの拡張、言い換えると、静的な結果ツリーフラグメントの拡張には使えないのです。
拡張したいテンプレートがmatch属性を持っているなら、xsl:apply-imports要素が使えます。パラメータを渡す事が出来ないので、どちらにしろあまり魅力的ではないですけれども。