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つの要素は、 templateapply-templates です。templateは、テンプレートを定義します。apply-templatesは、templateで定義されたテンプレートを呼び出します。

template(定義) ← apply-templates(呼び出し)

templateとapply-templatesは、両方とも ロケーションパス を属性として持つことができます。templateの match属性 と、apply-templatesの select属性 です。この2つの属性は、正反対の働きをします。

template match属性(ノードの受け入れ条件) ← apply-templates select属性(ノードの選出)

たとえで言うと、apply-templatesはテンプレートの方にノードを撃ち出す 大砲 のようなものです。select属性が選んできた弾(カレントノードリスト)を、順に筒に込めて(カレントノードにセットして)、テンプレートの方に撃ち出します。具体的にどのテンプレートを狙うかは決めずに撃ちます。 1

対するtemplateは、 のイメージです。mutch属性が門番になって、どのノードなら入ってもよいかを選別します。門番に拒まれたノードは、他の入り口を探します。全ての門番が拒んだ場合、最終的にデフォルトテンプレートにたどり着きます。複数の門が開いている場合は、優先順位の高いものに入ります。

http://www.teria.com/~koseki/emacswiki/imgs/xslgate.png

match属性もselect属性も、どちらも省略できます。

XSLTの全要素

XSLTの要素は、全部で35種類あります。以下のリストはapply-templatesが重複しています。

ループを回す

テンプレートを呼び出す

定義や宣言をする

条件分岐する

出力

文書

似ている要素の違いについて

copy / copy-of

copyはカレントノード(一つ)を出力するのに対し、copy-ofはカレントノードリスト(複数)を作成し、そのノード以下のツリーを出力するというのが一番の違いです。

copyは内容として、テンプレートを持つことができますが、copy-ofは内容を持つことができません。

value-of / copy-of

両方ともXPath式の結果を出力する要素ですが、value-ofは結果を常に文字列に変換して出力します。一方、copy-ofは結果がノードセットでない場合にだけ、文字列に変換して出力します。値がノードセットの場合は、そのノード以下のツリーを出力します。

以下参照

param / variable

両方とも変数を宣言する要素ですが、paramはXSLTやテンプレートの外部から値を書き換えできるのに対し、variableは書き換えできないというのが大きな違いです。

以下参照

import / include

優先度が異なります。

apply-templates / call-template / apply-imports

number / decimal-format

パターン

XSLTの仕様で、限定された ロケーションパス のことをパターンと呼びます。パターンは、以下の場所で使います。

パターンには、以下の制限があります。

key要素を使うと、パターンに名前を付けて保存することができます。key()関数を使って、そのパターンを呼び出します。

参照

処理のスタート地点

参照

脚注

[1] 具体的にどのターゲットを使用するか決めたい場合は、call-templateを使います。


KOSEKI Kengo <kengo@tt.rim.or.jp>