タイトル
TOP → This Page

XML > XSLT > テンプレートルール(template rule)

テンプレートルール


XML 文書中のどの要素・属性をどのように変換したいかを定義したものをテンプレートルールといい、
変換対象を指定するパターンと変換規則を指定するテンプレートで構成される。
テンプレートルールはトップレベル要素である xsl:template 要素で定義する。

(書式)
<xsl:template
     match="パターン"
     name="テンプレート名"
     priority="優先度"
     mode="モード名">

    ・・・テンプレート・・・

</xsl:template>

属性 内容
match どのノードを処理するためのものかを指定
XPath で指定する
(name 属性が指定された場合は省略可能)
(mode 属性が指定された場合は省略不可)
name テンプレートの名前
(match 属性が指定された場合は省略可能)
priority 優先度を数値で記述(省略可能)
mode モード名(省略可能)

(注意)
match 属性に指定可能なパターンには制限があり、
軸は child または attribute(@) しか指定出来ない。
(ただし、descendant-or-self は省略系の // のみ指定出来る)


(例)
<xsl:template match="Products">
    製品
</xsl:template>

上記の例は Products 要素全てに適用されるテンプレートルールになる


子要素へのテンプレートルールの適用


プロセッサは XML 文書をルートノードから子孫ノードへ順番に処理を進め、
テンプレートルールはこの処理でマッチした順番で適用される。
すると、テンプレートルールとして
「商品」、「名称(商品の子要素)」「価格(商品の子要素)」 を用意した場合に
「商品」→「商品」→「名称」→「名称」→「価格」→「価格」 と処理されてしまうが、
「商品」→「名称」→「価格」→「商品」→「名称」→「価格」 のように処理させたい場合がある。
このような場合、xsl:apply-templates を用いて xsl:template でマッチしたパターンの要素から、
さらにその子要素に対して処理させることが出来る。

(注意)
カレントノード(コンテキストノード)は xsl:template でマッチしたパターンの要素となる

(書式)
<xsl:apply-templates
    select="パターン"
    mode="モード名">

    ・・・ソート関連記述・・・(必要な場合)

</xsl:apply-templates>

ほとんどの場合で、属性なしまたは select 属性しか指定しないので
<xsl:apply-templates select="パターン"/>
と覚えておいても問題ないです

属性 内容
select どのノードを処理するためのものかを指定
XPath で指定する
(省略可能で省略した場合は全子要素になる)
mode モード名(省略可能)

(例)Products 要素の子要素 Price に適用されるテンプレートルール
<xsl:template match="Products">
	<xsl:apply-templates select="Price"/>
</xsl:template>

(例)Products 要素の子要素全てに適用されるテンプレートルール
<xsl:template match="Products">
	<xsl:apply-templates/>
</xsl:template>


モード


同じ要素に対して異なる複数のテンプレートルールを適用したい場合、
xsl:template や xsl:apply-templates の mode 属性を用いる。

(例)Products 要素の子要素 Name に2種類のテンプレートルールを適用する
<xsl:template match="Products">
	<xsl:apply-templates select="Name" mode="top"/>
	<xsl:apply-templates select="Name" mode="normal"/>
	<xsl:apply-templates select="Price"/>
</xsl:template>
<xsl:template match="Name" mode="top">
    <b><xsl:value-of select="."/></b><br/>
</xsl:template>
<xsl:template match="Name" mode="normal">
    <xsl:value-of select="."/>
</xsl:template>
<xsl:template match="Price">
    <xsl:value-of select="."/>
</xsl:template>


デフォルトテンプレート


要素ノード・ルートノードに合ったテンプレートがない場合、
以下のデフォルトテンプレートが使用される。

<xsl:template match="*|/">
	<xsl:apply-templates/>
</xsl:template>

テキストノード・属性ノードに合ったテンプレートがない場合、
以下のデフォルトテンプレートが使用される。

<xsl:template match="text()|@*">
	<xsl:value-of select=".">
</xsl:template>


名前付きテンプレートルールの呼び出し


名前を付けられたテンプレートルール(name 属性に値が設定してある xsl:template)は
xsl:call-template で呼び出し可能

(書式)
<xsl:call-template name="呼び出すテンプレートルールの名前"/>

(例)
<xsl:template match="/">
	<xsl:call-templates name="Products"/> ← 呼び出し側
</xsl:template>

<xsl:template name="Products"> ← 呼び出される側
	<xsl:value-of select="."/>
</xsl:template>


TOP → This Page