Xsl Transformation
Updated: 2002-11-23 06:14:57 -
[ Home |
Wiki Home | Index | Changes
]
XSLTは、XMLを変換するためのXML言語です。
目次
-
現実世界のサンプル
-
構造
-
最も重要な2つの要素
-
XSLTの全要素
-
-
ループを回す
-
テンプレートを呼び出す
-
定義や宣言をする
-
条件分岐する
-
出力
-
文書
-
似ている要素の違いについて
-
-
copy / copy-of
-
value-of / copy-of
-
param / variable
-
import / include
-
apply-templates / call-template / apply-imports
-
number / decimal-format
-
パターン
-
処理のスタート地点
-
参照
-
脚注
だいたいこんな見た目をしています。
xsl:stylesheet
(出力の設定・変数の宣言など)
xsl:template
(変数の宣言)
(出力)
(他のテンプレートの呼び出し)
/xsl:template
:
(xsl:templateくりかえし)
:
/xsl:stylesheet
実際にはもっと柔軟で、好きな場所にXSLTと関係ないタグを書いたりできます。
最も重要な2つの要素
XSLTで最も重要な2つの要素は、 template と apply-templates です。templateは、テンプレートを定義します。apply-templatesは、templateで定義されたテンプレートを呼び出します。
template(定義) ← apply-templates(呼び出し)
templateとapply-templatesは、両方とも ロケーションパス を属性として持つことができます。templateの match属性 と、apply-templatesの select属性 です。この2つの属性は、正反対の働きをします。
template match属性(ノードの受け入れ条件) ← apply-templates select属性(ノードの選出)
- templateのmatch属性は 受動的 です。カレントノードがどんな場合に、そのノードを受け入れてもよいか、という条件を表現しています。
- apply-templatesのselect属性は 能動的 です。カレントノードリストを作成し、その各ノードをカレントノードにセットしてtemplateを呼び出します。
たとえで言うと、apply-templatesはテンプレートの方にノードを撃ち出す 大砲 のようなものです。select属性が選んできた弾(カレントノードリスト)を、順に筒に込めて(カレントノードにセットして)、テンプレートの方に撃ち出します。具体的にどのテンプレートを狙うかは決めずに撃ちます。 1
対するtemplateは、 門 のイメージです。mutch属性が門番になって、どのノードなら入ってもよいかを選別します。門番に拒まれたノードは、他の入り口を探します。全ての門番が拒んだ場合、最終的にデフォルトテンプレートにたどり着きます。複数の門が開いている場合は、優先順位の高いものに入ります。
match属性もselect属性も、どちらも省略できます。
- match属性を省略した場合、apply-templatesから来る全てのノードを拒否します。このテンプレートが呼び出されるのは、call-template要素から名前で呼ばれた場合だけになります。
- select属性を省略した場合、その時点でのカレントノードの子が、次のカレントノードリストになります。
XSLTの要素は、全部で35種類あります。以下のリストはapply-templatesが重複しています。
- apply-templates …… カレントノードリストを作成し、ループを回し、それぞれに合うテンプレートを呼び出す。
- for-each …… カレントノードリストを作成し、ループを回し、それぞれに自身の内容をテンプレートとして適用する。
- sort …… ループの順番をソートする。apply-templatesやfor-eachの子の先頭に書く。
- apply-templates …… カレントノードリストを作成し、ループを回し、それぞれに合うテンプレートを呼び出す。
- call-template …… 名前でテンプレートを呼び出す。
- apply-imports …… 自分と同じノードにマッチするテンプレートのうち、自分の次に優先度が高いものを呼び出す。
- with-param …… テンプレートにパラメータを渡す。
- template …… テンプレートを定義する。
- param …… 変数を宣言し、デフォルト値を設定する。外部から値を変更できる。
- variable …… 変数を宣言し、値を設定する。一度割り当てた値は変更できない。
- attribute-set …… 属性のグループに名前を付ける。element要素から呼び出す。
- key …… ノードの選択パターンに名前を付ける。key()関数から呼び出す。
- decimal-format …… 数値のフォーマットを定義する。format-number()関数から呼び出す。
- namespace-alias …… 名前空間のプレフィックスに別名をつける。
- if …… 単一の条件判定。
- choose …… switch文。複数のwhenと、最後に一つのotherwiseを子に持つことができる。
- when …… chooseの子として、複数書ける。
- otherwise …… chooseの子として、一つだけ書ける。
- copy …… カレントノードを出力する。内容を持つ場合は、カレントノードに自身の内容をテンプレートとして適用する。
- copy-of …… カレントノードリストを作成し、それらのノードと全ての子孫を出力する。
- value-of …… XPathを評価して、文字列の値を出力する。
- element …… 要素を出力する。
- attribute …… 属性を出力する。
- text …… テキストを出力する。
- processing-instruction …… 処理命令を出力する。
- comment …… コメントを出力する。
- number …… ノードに番号をふる。
- message …… ログメッセージを出力する。
- fallback …… 親要素をXSLTプロセサが処理できない場合に、これの内容が代わりに使われる。
- transform …… ルート要素。
- stylesheet …… transformの別名。
- include …… 他のファイルに書かれたXSLTを取り込む。
- import …… 他のファイルに書かれたXSLTを、優先度低めで取り込む。
- output …… 変換結果の出力の仕方を指定する。
- preserve-space …… 空白だけのテキストノードを残す要素を指定する。(デフォルト)
- strip-space …… 空白だけのテキストノードを削除する要素を指定する。
似ている要素の違いについて
copy / copy-of
copyはカレントノード(一つ)を出力するのに対し、copy-ofはカレントノードリスト(複数)を作成し、そのノード以下のツリーを出力するというのが一番の違いです。
copyは内容として、テンプレートを持つことができますが、copy-ofは内容を持つことができません。
- copy …… カレントノードを出力する。
- copy-of …… カレントノードリストを作成し、ツリーを出力する。
value-of / copy-of
両方ともXPath式の結果を出力する要素ですが、value-ofは結果を常に文字列に変換して出力します。一方、copy-ofは結果がノードセットでない場合にだけ、文字列に変換して出力します。値がノードセットの場合は、そのノード以下のツリーを出力します。
- value-of …… XPath式の値を文字列で出力する。
- copy-of …… XPath式の値を文字列あるいはツリーで出力する。
以下参照
param / variable
両方とも変数を宣言する要素ですが、paramはXSLTやテンプレートの外部から値を書き換えできるのに対し、variableは書き換えできないというのが大きな違いです。
以下参照
- Studying XSLT - 後半にparam/variableの違いの説明があります。
- @IT - 中間あたりにparam/variableの違いの説明があります。
- MSDN - 「XSLT パラメータおよび変数の理解」の二段落目に、違いの説明があります。
優先度が異なります。
apply-templates / call-template / apply-imports
number / decimal-format
XSLTの仕様で、限定された ロケーションパス のことをパターンと呼びます。パターンは、以下の場所で使います。
- template要素のmatch属性
- key要素のmatch属性
- number要素のcount属性と、from属性
パターンには、以下の制限があります。
- 軸に使えるのは、child軸とattribute軸だけ。
- //は使ってもよいが、descendant-or-self軸は使えない。
- |でパターンをつないでノードの和集合を表現できる。
- id()とkey()関数を使える。
key要素を使うと、パターンに名前を付けて保存することができます。key()関数を使って、そのパターンを呼び出します。
参照
[1] 具体的にどのターゲットを使用するか決めたい場合は、call-templateを使います。
KOSEKI Kengo <kengo@tt.rim.or.jp>