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> |