気の向くままに辿るIT/ICT/IoT
XSLT

【Template Rules / テンプレート規則】XSLT 2.0/XSL Transformations Version2.0/Extensible Stylesheet Language Transformations Version2.0

ホーム前へ次へ
XSLTテンプレート規則とは?

【Template Rules / テンプレート規則】XSLT 2.0/XSL Transformations Version2.0/Extensible Stylesheet Language Transformations Version2.0

XSLT 2.0テンプレート規則とは

 W3C勧告XSLTバージョンXSLT 2.0「Template Rules / テンプレート規則」

 XSL Transformations (XSLT) Version 2.0 / W3C Recommendation 23 January 2007の目次に沿った日本語訳です。

 当サイト管理人が2009年04月、意訳したものですが、構文解釈の違いや翻訳の違いが含まれるかもしれません。正式文書はW3C 各種仕様書(英語版)である事を予めご了承ください。

<< 5. XSLTの特徴 / Features of the XSLT Language

XSLT 2.0テンプレート規則目次


6 テンプレート規則 / Template Rules
 6.1 定義されているテンプレート
 6.2 定義されているテンプレートルール
 6.3 提供されるテンプレートルール Applying Template Rules
 6.4 テンプレートルールにおける干渉解決 Conflict Resolution for Template Rules
 6.5 モード
 6.6 組み込みテンプレートルール
 6.7 最優先テンプレートルール

6 テンプレート規則

ノードに適用される事が可能な処理を定義するテンプレート規則は、固有のパターンとマッチします。

6.1 テンプレートを定義する

<!-- カテゴリ:宣言 -->
<xsl:template
  match? = pattern
  name? = qname
  priority? = number
  mode? = tokens
  as? = sequence-type>
  <!-- Content: (xsl:param*, sequence-constructor) -->
</xsl:template>

[定義:  xsl:template 宣言は、templateを定義します、それは、ノードと原子化された値か、 ノードまたは、原子化された値生成におけるシーケンスコンストラクタを含みます。 テンプレートは、パターンに対するノードとマッチする事によって実行したテンプレート規則として、または、名前によって明示的に実行した名前付きパラメータとしてのいずれかを提供する事ができます。 それはまた、双方の役割を提供する為に同じテンプレートを利用可能にします。 ]

[ERR XTSE0500] xsl:template 要素は、 match 属性、または、 name 属性、または、両方のいずれかを持っていなければいけません。 存在しない match 属性を持つxsl:template 要素は、 存在しない mode 属性 と存在しない priority 属性を持たなければいけません

もし、 xsl:template 要素が、 match 属性を持つ場合には、それは、 テンプレート規則です。 もし、それが、 name 属性を持つ場合には、それは、名前付きパラメータです。

テンプレートは、それが、テンプレート規則名前付きパラメータ、または、両方であるかどうかに依存する方法の番号で行使される場合があります。 テンプレートを実行した結果は、xsl:template 要素に含んだシーケンスコンストラクタを評価した結果です。 (参照先: 5.7 シーケンスコンストラクタ)。

もし、 as 属性が提示される場合には、 as 属性は、結果の要求タイプを定義します。 シーケンスコンストラクタを評価した結果である場合には、 関数変換規則を利用して要求タイプが変換されます。 もし、存在しない as 属性が、既定値は、 item()* と記述された場合には、それは、なにがしかの値を許容します。 存在しない変換の場合には、行われます。

[ERR XTTE0505] もし、要求タイプに変換される事が出来ないシーケンスコンストラクタを評価した結果である場合には、 それは、タイプエラーです。

6.2 テンプレート規則を定義する

このセクションは、テンプレート規則を定義します。 名前付きパラメータは、10.1 名前付きテンプレートの中で記述されます。

テンプレート規則は、 match 属性を伴う xsl:template 要素を利用して記述されます。 match 属性は、ノードを識別する、または、適用する規則におけるノードを識別するパターンです。 テンプレート規則を適用した結果は、文脈ノードとして利用したノードとの一致を伴う xsl:template 要素に含んだシーケンスコンストラクタを評価した結果です。

例:単純なテンプレート規則

例えば、XML文書は、(以下のように)含むでしょう:

This is an <emph>important</emph> point.

次に続くテンプレート規則は、 emph 要素 と boldfont-weight プロパティを伴う fo:wrapper 要素生成とマッチします。

<xsl:template match="emph">
	<fo:wrapper font-weight="bold"
			xmlns:fo="http://www.w3.org/1999/XSL/Format">
		<xsl:apply-templates/>
	</fo:wrapper>
</xsl:template>

テンプレート規則は、 xsl:apply-templates 命令が、 match 属性に記述したパターンとマッチするノードを選ぶ際に評価されます。 その xsl:apply-templates 命令は、次のセクションで記述されます。 もし、いくつかのテンプレート規則が、選択したノードとマッチする場合には、6.4 テンプレートにおける干渉解決規則で記述したように単にそれらの内の一つが評価されます。

6.3 テンプレート規則を適用する

<!-- カテゴリ: 命令 -->
<xsl:apply-templates
  select? = expression
  mode? = token>
  <!-- Content: (xsl:sort | xsl:with-param)* -->
</xsl:apply-templates>

そのxsl:apply-templates 命令は、ノードのシーケンスを入力として受け取り、 (概してソースツリーにあるノード)、そしてアイテムのシーケンスを出力として生成します; これらは、しばしば、結果ツリーに追加される為のノードとなるでしょう。

もし、その命令が、1つ以上の子 xsl:sort を持つ場合には、 入力シーケンスは、13 ソートするに記述したようにソートされます。 このソート結果は、ソート済みシーケンスとして以下に参照されます; もし、それらが、存在しない xsl:sort 要素である場合には、 ソートしたシーケンスは、入力シーケンスと同じです。

入力シーケンスにあるそれぞれのノードは、ノードとマッチするパターンのあるテンプレート規則を見つける事によって処理されます。 もし、それらが、1つ以上ある場合には、6.4 テンプレートにおける干渉解決規則に記述した規則を利用して、それらの中でベストなものが選択されます。 もし、ノードとマッチするパターンを持つテンプレート規則がない場合には、 ビルトイン(組み込み) テンプレート規則が、利用されます(参照先: 6.6 ビルトイン(組み込み) テンプレート規則)。 その選んだテンプレート規則が評価されます。 ソートしたシーケンスにある N 番目のノードとマッチする規則は、 文脈アイテムとしてノードを伴い、文脈位置として N を伴い、文脈サイズとしてソートしたシーケンスの長さを伴って評価されます。 各テンプレート規則は、その結果としてアイテムのシーケンス生成を評価されます。 結果シーケンス(ソートしたシーケンスにある各ノードの1つ)は、その際に単独のシーケンスから単独のシーケンスへ結合されます。 それらは、ソートしたシーケンスにあるノードの命令をそのままにして結合されます。 最後に結合したシーケンスは、 xsl:apply-templates 命令の結果を形成します。

例:テンプレート規則を適用する

ソース文書が次のようになるものとします(事を提案します):

<message>Proceed <emph>at once</emph> to the exit!</message>

これは、以下に示した2つのテンプレート規則を利用して処理される事が可能です。

<xsl:template match="message">
	<p>
		<xsl:apply-templates select="child::node()"/>
	</p>
</xsl:template>
<xsl:template match="emph">
	<b>
		<xsl:apply-templates select="child::node()"/>
	</b>
</xsl:template>

文書ノードにおけるテンプレート規則はありません; このノードにおけるビルトイン(組み込み)テンプレート規則は、処理される為の message 要素に起因します。 結果ツリーに書かれる為の p 要素に起因する message 要素におけるテンプレート規則; この p 要素のコンテンツは、 xsl:apply-templates 命令の結果として構築されます。 この命令は、 message 要素 の3つの子ノードを選択します (値" Proceed " を含んでいるテキストノード、 emph 要素ノード、 値" to the exit!" を含んでいるテキストノード)。 2つのテキストノードは、テキストノードにおけるビルトイン(組み込み)テンプレート規則を利用して処理され、それは、テキストノードのコピーを返します。 emph 要素は、 match="emph" を記述する明示的なテンプレート規則を利用して処理されます。

emph 要素が処理される際に、このテンプレート規則は、 b 要素を構築します。 単独のノードを選ぶケースでは、 b 要素のコンテンツは、 その他の xsl:apply-templates 命令という意味によって構築されます (値 " at once "を含んでいるテキストノード)。 これは、テキストノードにおけるビルトイン(組み込み)テンプレート規則を利用して再び処理され、それは、テキストノードのコピーを返します。

match="message" テンプレート規則の最終結果は、このように3つの子を持つ p 要素で構成します: 値" Proceed "を含んでいるテキストノード、 b 要素は、値" at once "を含んでいるテキストノードの親であり、 それと値 " to the exit! "を含んでいるテキストノードの3つ。 この結果ツリーは、(以下の)ようにシリアライズされるかもしれません:

<p>Proceed <b>at once</b> to the exit!</p>

select 属性の既定値は、 child::node() であり、それは、処理される為の文脈ノードの子全てに起因します。

[ERR XTTE0510] もし、存在しない select 属性を伴う xsl:apply-templates 命令が、 文脈アイテムがノードではない時に評価される場合には、それは、タイプエラーです。

select 属性は、全ての子を処理する代わりに式によって選択したノードを処理する為に利用される事が可能です。 select 属性の値は、です。 式は、ノードのシーケンスを評価し なければいけません。(それは、ゼロか1つ以上含む事が可能)。

[ERR XTTE0520] もし、シーケンスが、ノードではないアイテムを含む select 式によって返した場合には、それは、タイプエラーです。

注釈:

XSLT 1.0では、 select 属性は、文書命令にある処理された既定によってノードのセットを選択しました。 XSLT 2.0では、それはノードのシーケンスを選びます。 XSLT 1.0で妥当である間というケースでは、式は、文書命令にあるノードのシーケンスを返すでしょう、その為、その効果は、同じです。

例:選択したノードにテンプレートを適用する

次に続く例は、 author-groupの子である author 要素の子 given-name の全てを処理します:

<xsl:template match="author-group">
	<fo:wrapper>
		<xsl:apply-templates select="author/given-name"/>
	</fo:wrapper>
</xsl:template>

 

例:子孫ではないノードにテンプレートを適用する

それはまた、文脈ノードの子孫ではない要素を処理する事も可能です。 この例は、子 group と子孫 employee を持つ department 要素であるものと仮定します。 それは、 employee で構成される department であり、 そしてその時、 department の子 group を処理します。

<xsl:template match="employee">
	<fo:block>
		Employee
		<xsl:apply-templates select="name"/>
		belongs to group
		<xsl:apply-templates select="ancestor::department/group"/>
	</fo:block>
</xsl:template>

 

例:スキーマ定義タイプによるマッチング

それは、要素、または、属性のスキーマ定義タイプに一致するマッチされるテンプレート規則を書く事を可能にします。 次に続く例は、それらのタイプに依存した要素の子に異なるフォーマットを適用します:

<xsl:template match="product">
	<table>
		<xsl:apply-templates select="*"/>
	</table>
</xsl:template>
<xsl:template match="product/*" priority="3">
	<tr>
		<td><xsl:value-of select="name()"/></td>
		<td><xsl:next-match/></td>
	</tr>
</xsl:template>
<xsl:template match="product/element(*, xs:decimal) | 
			 product/element(*, xs:double)" priority="2">	
	<xsl:value-of select="format-number(xs:double(.), '#,###0.00')"/>
</xsl:template>
<xsl:template match="product/element(*, xs:date)" priority="2">
	<xsl:value-of select="format-date(., '[Mn] [D]、 [Y]')"/>
</xsl:template>
<xsl:template match="product/*" priority="1.5">
	<xsl:value-of select="."/>
</xsl:template>

xsl:next-match 命令は、6.7 最優先テンプレート規則で記述されます。

 

例:結果ツリーにある要素を再指定

複数の xsl:apply-templates 要素は、単純な再指定をする為に単独のテンプレート内で利用される事が可能です。 次に続く例は、2つのHTMLテーブルを創出します。 その最初のテーブルは、2つめのテーブルが foreign(外国) の sales(販売) を満たす間、 domestic(国内)の sales(販売)を満たします。

<xsl:template match="product">
	<table>
		<xsl:apply-templates select="sales/domestic"/>
	</table>
	<table>
		<xsl:apply-templates select="sales/foreign"/>
	</table>
</xsl:template>

 

例:再帰的な構造処理

それは、それが他の子孫である場合に2つが子孫とマッチするようになる事を可能にします。 このケースは、特別には扱われません。:双方の子孫は、通常通り処理されるでしょう。

例えば、ソース文書を与えると

<doc><div><div></div></div></doc>

その規則は、

<xsl:template match="doc">
	<xsl:apply-templates select=".//div"/>
</xsl:template>

外側の div と内側の div 要素の両方を処理するでしょう。

これが意味するところは、もし、それ自身の子を処理する div 要素におけるテンプレート規則がある場合には、 これらの孫は、一回以上処理され、それは、おそらく要求されたものではないでしょうという事です。 その解決策は、 select=".//div" の位置で select="div" を利用する事によって再帰的な系統にある時点で1レベル処理する事です。

注釈:

その xsl:apply-templates 命令は、 たいてい文脈ノードの子孫であるノードを処理する事を一般的に利用します。 このような xsl:apply-templates の利用は、 終わりのない処理ループ(無限ループ)の中で結果を出す事は不可能です。 しかしながら、 xsl:apply-templates が、文脈ノードの子孫ではない要素を処理する為に利用される際には、 終わりのないループ(無限ループ)を生じる可能性があります。 例えば、

<xsl:template match="foo">
	<xsl:apply-templates select="."/>
</xsl:template>

手法は、いくつかのケースでは、このようなループを回避する事が可能な場合がありますが、 しかし、その可能性の存在は(あるものの)、スタイルシートが、回避不能な手法で終わりのないループを入力とする場合があります。 これは、サービスセキュリティリスクの拒否を提示する場合があります。

6.4 テンプレート規則における衝突解決策

それは、1つ以上 テンプレート規則 とマッチするソース文書にあるノードにおいて可能にします。 これが生じる際というのは、単に1つのテンプレート規則が、ノードにおいて評価されます。 利用される為のそのテンプレート規則は、次に続くように決められます:

  1. まず、単にテンプレート規則と一致している、または、最も高い取り込み優先度を持つ規則が、考慮されます。 他の低い優先度を持つ一致するテンプレート規則は、考慮から排除されます。

  2. 次に、一致する規則に残っている構成、最も高い優先度を持つそれらだけが考慮されます。 他の低い優先度を持つ一致するテンプレート規則は、考慮から排除されます。 テンプレート規則の優先度は、 xsl:template 宣言上にある priority 属性によって記述されます。

    [ERR XTSE0530] この属性の値は、[XML スキーマ Part 2]で定義した xs:decimal タイプにおける規則に従わなければいけません。 現実の値は、許容されます

    [定義:  もし、存在しない priority 属性が、 xsl:template 要素上で記述される場合には、 既定優先度は、 match 属性で提供したパターンのシンタックスを基準に算出されます。 ] その規則は、次のようになります:

    • もし、そのパターンが、 | によって分割した複数の選択肢を含む場合には、 テンプレート規則は、それぞれの選択肢につき1つずつテンプレート規則のセットと等しくなるように扱われます。 たとえ、もし、ノードが選択肢の1つ以上とマッチする場合があったとしてもエラーではありません。

    • もし、そのパターンが、 / から得たものを持つ場合には、その優先度は、 -0.5 です。

    • もし、そのパターンが、PatternAxisによって付加的に優先されるQNameから得たものを持つ場合、または、 フォーム processing-instruction(StringLiteralXP) または、PatternAxisによって付加的に優先される processing-instruction(NCNameNames) である場合には、その優先度は、 0 です。

    • もし、そのパターンが、ElementTestXP、または、 PatternAxisによって付加的に優先されるAttributeTestXPのフォームを持つ場合、 その優先度は、以下のテーブルに示すようになります。 このテーブルでは、シンボル * が、それ自身を表示する間、シンボル EAT は、各々任意の要素名、属性名、タイプ名を表示します。 タイプ名に続くシンボル ? の存在、または、欠如は、優先度の作用はありません。

      フォーマット 優先度 注記
      element() -0.5 ( * と同等)
      element(*) -0.5 ( * と同等)
      attribute() -0.5 ( @* と同等)
      attribute(*) -0.5 ( @* と同等)
      element(E) 0 (E と同等)
      element(*,T) 0 (タイプのみによるマッチ)
      attribute(A) 0 ( @A と同等)
      attribute(*,T) 0 (タイプのみによるマッチ)
      element(E,T) 0.25 (名前とタイプによるマッチ)
      schema-element(E) 0.25 (部分文字列グループとタイプによるマッチ)
      attribute(A,T) 0.25 (名前とタイプによるマッチ)
      schema-attribute(A) 0.25 (名前とタイプによるマッチ)
    • もし、そのパターンが、DocumentTestXPの形式を持つ場合には、 もし、それが、存在しないElementTestXP または、SchemaElementTestXP を含む場合には、その優先度は、 -0.5 です。 もし、それが、 ElementTestXP または、SchemaElementTestXP を含む場合には、その優先度は、上記テーブルと一致する算出した ElementTestXP または、SchemaElementTestXP の優先度と同じです。

    • もし、そのパターンが、フォームNCNameNames:*、または、 PatternAxisによって付加的に優先される*:NCNameNamesを持つ場合には、 その優先度は、 -0.25 です。

    • もし、そのパターンが、いくつかの他のPatternAxisによって付加的に優先されるNodeTestXPである場合には、 その優先度は、 -0.5 です。

    • この他は、その優先度は、 0.5 です。

    注釈:

    多くのケースでは、これが意味するところは、最も高い選択能力のあるパターンは、優先度の低い選択能力のあるパターンよりも高い優先度を持つという事です。 最も一般的なパターンの種類 (固有の拡張QNameを伴う固有の種類、または、固有のタイプのノードにおけるテストパターン)は、優先度 0 を持ちます。 次に低いパターンの種類の仕様 (固有の種類のノードと固有の名前空間URIを伴う拡張QNameにおけるテストパターン)は、優先度 -0.25 を持ちます。 これよりも低い仕様のパターン(与えられる種類のノードにおいてぴったりのテストパターン)は、優先度 -0.5 を持ちます。 その名前 または、 そのタイプを単に記述するパターン上にそれらを設定する名前と要求タイプ両方を記述するパターンは、 +0.25 の優先度を持ちます。 これよりも多くを明記するパターン、例えば、述語や要求したノードの先祖に記述する述語を含むパターンは、優先度 0.5 を持ちます。

    しかしながら、より選択能力のあるパターンが、低いパターンよりも優先度が高いという事が、いつも決まっているわけではありません。 例えば、パターン node()[self::*] の優先度は、パターン salary のそれよりも高いのです。 とてもよく似ている、パターン attribute(*, xs:decimal)attribute(*, xs:short) は、同じ優先度を持つにもかかわらず、前者によってマッチしたノードのサブセットとマッチするのは後者のパターンという事です。 それゆえに、スタイルシートを明快に達成する事(スタイルシートをわかりやすく、意図したとおりに正しく書く事)、それが明示的にプロパティの領域を確保する為の良い慣習(グッドプラクティス)です。

[ERR XTRE0540] もし、テンプレート規則においてその衝突解決アルゴリズムが、テンプレート規則と1つ以上マッチしている場合には、それは、回復可能な動的エラーです。 その付加的な回復動作というのは、宣言指定で最後に出現するそれを左側にあるテンプレート規則に一致しているものから選択する事です。

6.5 モード

[定義:  モードは、複数回処理される為にソースツリーにある回ごとに異なる結果を生成するノードを許容します。 それらはまた、 異なるツリーを処理する際に、例えば、 document 関数を利用して読み込んだ文書を処理する際に、 (参照先: 16.1 複数のソース文書)、または、 一時的なツリーを処理する際に、 アクティブにする為の異なるテンプレート規則のセットも許容します。 ]

[定義:  それらは、常に既定モードが利用可能です。 その既定モードは、名前付けされない(名無し)モードであり、そしてそれは、 存在しない mode 属性が、 xsl:apply-templates 命令上で記述される際に利用されます。 ]

既定モードでない各モードは、QNameによって識別されます。

テンプレート規則は、1つ以上のモードに適用されます。 適用できるモードは、 xsl:template 要素の mode 属性によって定義されます。 もし、その属性が、省略された場合には、テンプレート規則は、既定モードが適用されます。 もし、その属性が、提示される場合には、その値は、テンプレート規則が適用できるモードを定義するそれぞれのトークンのカラでないホワイトスペースで区切られたリストにしなければいけません。 各トークンは、次に続くうちの1つにしなければいけません。:

  • QNameは、モードの名前を定義する為の5.1 適切な名前で記述したように拡張される

  • トークン #default は、既定モードに適用されるテンプレート規則を示すこと

  • トークン #all は、全てのモードに適用されるテンプレート規則を示すこと (それは、既定モードの為、そしてxsl:apply-templates 命令にある、または、スタイルシートのどこかにある xsl:template 宣言といった名前付けされた各モードの為に、という事です。)

[ERR XTSE0550] もし、そのリストがカラである場合には、もし、同じトークンがリストに1回以上含まれる場合には、 もし、そのリストが、妥当なトークンである場合には、または、もし、そのトークン #all が、他の値を伴って一緒に現れる場合には、 それは、静的エラーです。

xsl:apply-templates 要素はまた、付加的な mode 属性も持ちます。 この属性の値は、QNameであるか、または、モードの名前を定義する為の5.1 適切な名前で記述したように拡張されるか、または、 既定モードが、利用される為に、または、カレントモードが、利用される事を示すためのそのトークン #current のいずれかにしなければいけません。 もし、その属性が省略される場合には、既定モードが利用されます。

xsl:apply-templates 命令よって選択したノードごとに処理する為のテンプレート規則を検索する際には、 単にそれらのテンプレート規則は、選択したモードが考慮される為に適用されます。

[定義:  スタイルシートの処理する中にあるいくつかのポイントでは、それらはカレントモードです。 変換が開始される際には、2.3 変換初期化で記述したように提供されている異なる初期モードでない限りは(の場合を除いては)、カレントモードは、既定モードです。 xsl:apply-templates 命令は評価されるたびに、 そのカレントモードは、この命令によって選択したモードになります。 ] スタイルシート関数が呼ばれる際には、カレントモードは、既定モードになります。 他の命令がないものは、カレントモードに変更します。 xsl:apply-templates 命令の完了、 または、スタイルシート 関数呼び出しから返る完了では、カレントモードは、その前の値に戻ります。 カレントモードは、 xsl:apply-templates 命令が、シンタックス mode="#current" を利用する際に利用されます; それはまた、 xsl:apply-imports xsl:next-match 命令によっても利用されます。(参照先: 6.7 最優先テンプレート規則)。

6.6 ビルトイン(組み込み)テンプレート規則

xsl:apply-templates によって選択され、ノードを処理する為に利用される事が可能であるスタイルシートの中にテンプレート規則がない場合には、 ビルトイン(組み込み)テンプレート規則が、代わりに評価されます。

ビルトイン(組み込み)テンプレート規則は、すべてのモードに適用します。

文書ノードと要素ノードにおけるビルトイン(組み込み)規則は、存在しない select 属性を伴う xsl:apply-templates を呼ぶ為に評価されます。 mode 属性 は、 #current を設定します。 もし、そのビルトイン(組み込み)規則が、パラメータを伴って実行された場合には、それらのパラメータは、暗黙のうちに xsl:apply-templates 命令の中で通過されます。

例:ビルトイン(組み込み)テンプレート規則を利用する

例えば、次に続く命令を含むスタイルシートであるものとします:

<xsl:apply-templates select="title" mode="mm">
	<xsl:with-param name="init" select="10"/>
</xsl:apply-templates>

もし、 title 要素と一致する明示的なテンプレート規則がない場合には、次に続く暗黙の規則が利用されます:

<xsl:template match="title" mode="#all">
	<xsl:param name="init"/>
	<xsl:apply-templates mode="#current">
		<xsl:with-param name="init" select="$init"/>
	</xsl:apply-templates>
</xsl:template>

テキストと属性ノードにおけるビルトイン(組み込み)テンプレート規則は、文脈ノードのstring値を含んでいるテキストノードを返します。 それは、事実上(実際の設定は下記の通り):

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

注釈:

このテキストノードは、ゼロの長さの文字列値を持つ場合があります。

処理命令とコメントにおけるビルトイン(組み込み)テンプレート規則は、何もしません。(それはカラのシーケンスを返します)。

<xsl:template match="processing-instruction()|comment()" mode="#all"/>

名前空間ノードにおけるビルトイン(組み込み)テンプレート規則もまた、何もする事はありません。 名前空間ノードとマッチする事が可能なパターンがなく、 その為、 xsl:apply-templates が名前空間ノードを選択する際には、ビルトイン(組み込み)テンプレート規則が、常に利用されます。

ビルトイン(組み込み)テンプレート規則は、他の全てのテンプレート規則よりも低い取り込み優先度を持ちます。 このように、スタイルシート作者は、明示的にテンプレート規則を含む事によってビルトイン(組み込み)テンプレート規則を優先する事が可能です。

6.7 最優先テンプレート規則

<!-- カテゴリ: 命令 -->
<xsl:apply-imports>
  <!-- Content: xsl:with-param* -->
</xsl:apply-imports>

<!-- カテゴリ: 命令 -->
<xsl:next-match>
  <!-- Content: (xsl:with-param | xsl:fallback)* -->
</xsl:next-match>

その他のテンプレート規則 (参照先: 6.4 テンプレートにおける干渉解決規則)を最優先する為に利用されるテンプレート規則は、 xsl:apply-imports 、 または、最優先テンプレート規則を実行する為の xsl:next-match 命令を利用する事が可能です。 xsl:apply-imports 命令は、取り込みスタイルシートモジュールにあるテンプレート規則だけを考慮します; xsl:next-match 命令は、より低い取り込み優先度 と優先度(priority)、または、取り込み優先度または優先度(priority)の他の全てのテンプレート規則を考慮します。 双方の命令は、もし、他のテンプレート規則が見つからない場合には、ノードにおける組み込みテンプレート規則(参照先: 6.6 ビルトイン(組み込み)テンプレート規則)を実行するでしょう。

[定義:  スタイルシートの処理する中にあるいくつかのポイントは、カレントテンプレート規則になる場合があります。 テンプレート規則が、 xsl:apply-imports 、 または、 xsl:next-match といったxsl:apply-templates 評価の結果として選択されるたびに、 テンプレート規則は、その規則のシーケンスコンストラクタの評価においてカレントテンプレート規則になります。 xsl:for-eachxsl:for-each-groupまたは、 xsl:analyze-string 命令が、評価されるか、 または、 xsl:sort 、または、 xsl:key 要素に含まれたシーケンスコンストラクタを評価する際に、 または、 スタイルシート関数 (参照先: 10.3 スタイルシート関数)が呼ばれる際に、 カレントテンプレート規則は、その命令、または、関数の評価においてNullになります。 ]

カレントテンプレート規則は、名前付きテンプレート (参照先: 10.1 名前付きテンプレート)、または、 名前付き属性セット(参照:10.2 名前付き属性セット)を実行する事によって作用するわけではありません。 グローバル変数または、スタイルシートパラメータの既定値 (参照先: 9.5 グローバル変数とパラメータ)を評価中は、カレントテンプレート規則は、Nullです。

注釈:

これらの規則は、xsl:apply-imports または、 xsl:next-match が呼ばれる際には、 文脈アイテムが、常にノードが存在するカレントテンプレート規則が実行される際と同様である事を保証します。

テンプレート規則において検索する xsl:apply-importsxsl:next-match の双方は、 文脈ノードとマッチし、そしてそれは、 カレントモードに適用できるようにします (参照先: 6.5 モード)。 テンプレート規則の選択では、 それらは、 優先度(priority)とテンプレート規則の取り込み優先度のような習慣的な基準を利用します。 しかし、それらは、スタイルシートにあるテンプレート規則のサブセットだけを候補として考慮します。 このサブセットは、2つの命令間で異なります:

  • スタイルシートレベルに含まれるそれらのテンプレート規則だけを候補として考慮する xsl:apply-imports 命令は、 カレントテンプレート規則を含むスタイルシートレベル取り込みツリーにある子孫です。

    注釈:

    これは、カレントテンプレート規則のそれよりも低い取り込み優先度である全てのテンプレート規則を考慮して検索するという事と同じではありません

  • それらすべてのテンプレート規則を候補として考慮する xsl:next-match 命令は、6.4 テンプレートにおける干渉解決規則で与えられる衝突解決規則によって含んだテンプレート規則の指定にあるカレントテンプレート規則の後に来ます。 それは、カレントテンプレート規則よりも低い取り込み優先度を伴う全てのテンプレート規則を考慮するという事であり、 加えて、そのテンプレート規則は、カレントテンプレート規則よりも低い優先度を持つ取り込み優先度と同じです。 もし、プロセッサが、エラーから回復されている場合には、2つの一致しているテンプレート規則が、同じ取り込み優先度と優先度(priority)を持つ際には出現し、その時、それはまた、 宣言指定にあるカレントテンプレート規則の前に現れる同じ取り込み優先度と優先度(priority)を持つ一致しているテンプレート規則も全て考慮します。

    注釈:

    6.4 テンプレートにおける干渉解決規則で説明したように、 | によって分割した複数の選択肢を含むパターンと一致するテンプレート規則は、それぞれの選択肢ごとに1つずつテンプレート規則のセットが等しく扱われます。 これが意味するところは、選択肢と1つ以上マッチする同じノードの場合、そして選択肢が、異なる優先度を持つ場合には、それは、再帰的に実行される為のカレントテンプレート規則に起因する xsl:next-match 命令において利用可能とするという事です。 このシチュエーションでは、同じ優先度を持つ選択肢である際には、出現しません。

もし、これらの基準を満たす一致しているテンプレート規則が見つけられない場合には、ノード種別におけるビルトイン(組み込み)テンプレート規則 (参照先: 6.6 ビルトイン(組み込み) テンプレート規則)が利用されます。

xsl:apply-imports または、 xsl:next-match 命令は、 テンプレート規則を選択するパラメータを通過させる為にxsl:with-param 子要素を利用する場合があります (参照先: 10.1.1 テンプレートにパラメータを通過させる)。 それはまた、10.1.2 トンネルパラメータで記述したように、いくつかのトンネルパラメータも通過させます。

[ERR XTDE0560] もし、 xsl:apply-importsまたは、 xsl:next-match が、カレントテンプレート規則がNullである際に評価される場合には、それは、回復されない動的エラーです。

例: xsl:apply-imports を利用する

例えば、 example 要素におけるテンプレート規則を含むスタイルシート doc.xsl があるものとします:

<xsl:template match="example">
	<pre><xsl:apply-templates/></pre>
</xsl:template>

その他のスタイルシートは、 doc.xsl を取り込む事が可能で、次に続くように example 要素の扱いを緩和します:

<xsl:import href="doc.xsl"/>
<xsl:template match="example">
	<div style="border: solid red">
		 <xsl:apply-imports/>
	</div>
</xsl:template>

組み合わさった作用は、フォームの要素に example を変換する事になるでしょう:

<div style="border: solid red"><pre>...</pre></div>

xsl:fallback 命令は、XSLT 2.0プロセッサによって無視される xsl:next-match 命令の子として現れていますが、 しかし、スタイルシートが前方互換性モードでXSLT 1.0プロセッサによって処理される際にフォールバック(縮退)挙動を定義する為に利用される事が可能です。

7. 繰り返し・反復 / Repetition >>


ホーム前へ次へ