Jintrick.netagenda2003年05月アーカイブ → 2003年05月25日

結果ツリーフラグメントの拡張(XSLT1.0)

あるウェブページ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

テンプレートの拡張には、xsl:apply-imports要素があるではないかと思われるかもしれません。しかしこれは名前付きテンプレートの拡張、言い換えると、静的な結果ツリーフラグメントの拡張には使えないのです。

拡張したいテンプレートがmatch属性を持っているなら、xsl:apply-imports要素が使えます。パラメータを渡す事が出来ないので、どちらにしろあまり魅力的ではないですけれども。


webmaster@jintrick.net
公開: 2003年05月25日
カテゴリ: XSLT