テンプレート


XSL のルート要素

XSLT における基本概念は、XML の木構造の解析にあります
木構造とは、コンピュータ科学の基礎概念で
必ず ルート(根)、ノード(接点)、リーフ(葉)で構成されます

ルートとは、木構造の頂点に位置する要素であり、リーフは最下層の子要素を表します
その間に位置する全ての要素はノードと呼ばれるのが一般的です

ルート
||
ノードノード
||||
リーフリーフノードリーフ
|
リーフ

XML もこの概念に基き、ルート要素が必ずありますね
そして、ルート要素はリーフに向かって、型定義に基いた子要素を持ちます
子要素、すなわちノードをたどっていけば、いつかリーフにたどりつきます
コンピュータ科学の分野では、いかにノードを検索していくかというのも重要になりますが
XSLT はプログラミング言語ではないので、そのような心配は必要ありません

XML の木構造のノードとなるのは要素とその内容だけでした
しかし、XSL においては属性、名前空間、処理命令、コメントもノードとなります
詳しくは、これから少しづつ解説していきますが、頭の片隅に覚えておいてください

XSLT 文書を書くにあたって、最初に *.xsl という拡張子のファイルを用意してください
XSLT も XML 同様に、実体は単純なテキスト形式にすぎないので
XSLT を記述するアプリケーションは、メモ帳でもワードパッドでもかまいません

XSL は XML の一つなので、最初はやはり XML 宣言から始まります
また、XSL はxsl 名前空間に属しています
この名前空間は、勧告で http://www.w3.org/1999/XSL/Transform となっています

XSL のルート要素は xsl:stylesheet 要素です
この要素は、XSL 名前空間を指定する xmlns:xsl 属性と version 属性を必須としています
version 属性の値は、現状では 1.0 となります
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
</xsl:stylesheet>
サンプルを見る

この XSL 文書は、Microsoft Internet Explorer6 のために書かれた文書です
XSL の実体は XML にすぎないので、いつもどおり単純な XML 文書として認識されるでしょう
XSL 文書は、単独ではただの XML 文書にすぎないのです
しかし、これが XML 文書と関連付けられれば、文書を変換させる魔法の文書になるのです


XSL テンプレート

XSLT は、何らかの入力文書を受け取り、これを変換して出力します
出力先は定められていないので、ブラウザかもしれませんし、ファイルかもしれません

XSLT では、入力文書のノードを検索し
一致したノードに対してどのような文書を出力するかを記述します
出力する文書の基盤(サンプル)をテンプレートと呼びます

テンプレートは xsl:template 要素の内容として記述します
xsl:tempate 要素は match 属性を持ち、この属性にノードを指定します
例えば、次の文書は line 要素を br 要素に変換するテンプレートです
<xsl:template match="line">
	<br />
</xsl:template>
もちろん、これを処理するまでには line がどの要素の子なのか
ルートノード、ルート要素の検索などの過程が必要です
このような xsl:template 要素の定義をテンプレート・ルールと呼びます

XSLT から出力される最初の文字列は、出力文書のルート要素であるべきです
そのため、XSLT が最初にルートノードで初期化する必要があります
すなわち、XSLT は必ずルートノードのテンプレートを最初に出力すると考えることができます

ルートノードは xsl:template 要素の match 属性値に "/" を指定します
これで、入力ツリーのルート・ノードに適応され、文書を出力することができます

XML 文書が XSL を利用する場合 xml-stylesheet 処理命令を使います
この処理命令には type 属性と href 属性を指定しなければなりません
type 属性には text/xsl を、href 属性には XSL 文書のアドレスを指定します

<?xml:stylesheet type="text/xsl" href="URI"?>

XML 文書がこのような処理命令を持っていて
文書を表示(または出力)するアプリケーションが XSLT に対応していれば
href で指定された XSL 文書が読み込まれ XML 文書が変換されて出力されるでしょう
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="02_000_000.xsl"?>
<object>
</object>
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:template match="/">
		<html>
			<head>
				<title>Kitty on your lap</title>
			</head>
			<body>
				<h1>Magical nyan nyan TARUTO</h1>
			</body>
		</html>
	</xsl:template>
</xsl:stylesheet>
サンプルを見る

test.xml 文書は test.xsl 文書に入力する XML 文書です
XSLT に対応したアプリケーションに test.xml を読み込ませれば
test.xsl ファイルも読み込まれ、XML 文書が変換されて出力されるでしょう

XML 文書は、ルート要素 object だけの、なにも書かれていない文書です
XSLT は、これを読み込んでルートノードのテンプレートを処理します
上のサンプルでは、整形式 HTML 文書を出力します
結果として、Magical nyan nyan TARUTO と書かれた文書が表示されることでしょう

普段、XML 文書は Internet Explorer で読み込んでも、ツリーしか表示しませんでした
しかし、XSLT を用いれば、XML 文書を HTML などに変換してブラウザで表示できるのです
これは、XML が普及するまでの間の代替手段として、もっとも高度なものでしょう
(もっとも、この文書を書いている 2002/03/02 日では、XSLT も実装も乏しいが…)


ノードの検索と処理

上記した方法でルートノードを処理することができました
しかし、ルートノードは木構造の「根」の部分であり、変換処理はまだ何もされていません
上の XSLT 文書は XML 文書に関わらず無条件で同じ結果を出力します

ノードの子要素をたどるには xsl:apply-templates 要素を用います
この要素を指定すると、XSL 文書を処理しているフォーマットプログラムは
XSL の文書の xsl:template 要素を再帰的に処理します

xsl:template 要素は、現在処理中のノードから相対的にノードを検索します
つまり xsl:apply-templates が最後に発生した位置のノードから相対的な要素に一致します
この、再帰的な検索処理を理解することが、XSLT の理解につながります
静的な HTML に慣れすぎてしまった人には、少し難しく感じるかもしれませんが
一度、その原理を知れば簡単だとなのでがんばりましょう

ルートノードに対応したテンプレート内で xsl:apply-templates が用いられると
ルートノードの子ノードを検索するために xsl:template が再び処理されます
検索が終われば、制御は xsl:apply-templates に戻ります

xsl:template 要素の match 属性に、要素名を指定すれば
指定した要素にマッチした時、そのテンプレートが出力されます
こうすれば、特定の要素を特定のテンプレートで出力することができるようになります
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="02_001_000.xsl"?>

<object>
</object>
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:template match="/">
		<html>
			<head></head>
			<body><xsl:apply-templates /></body>
		</html>
	</xsl:template>

	<xsl:template match="object">
		<h1>Kitty on your lap</h1>
	</xsl:template>
</xsl:stylesheet>
サンプルを見る

さて、この XSL 文書を理解できるかどうかが重要です
これさえ理解することができれば、今後はさほど難しくはありません

プログラムが XML と XSL を読み込んで、フォーマット変換を行う時
先ほどと同様に、まずはルートノードがテンプレートルールにマッチして処理されます
重要なのは、ルートノードのテンプレートに xsl:apply-templates 要素がある点です

xsl:apply-templates 要素からは、子ノードを対象に再びテンプレートルールが処理されます
ルートノードの子ノードは、文書のルート要素と考えられます
XML 文書を見ると object 要素がルート要素となっているのがわかりますね

最初のテンプレートルール match="/" は object 要素と一致しません
そのため、このテンプレートが処理されることはありません
次に、2番目のテンプレートルール match="object" と比較されます
ここで、子ノード object と一致するため、このテンプレートが出力されます

object のテンプレートが出力されると、フォーマットプログラムは制御を戻します
再び "/" のテンプレートに処理が戻り、最後に </html> が出力して処理が終わります
もし、入力 XML 文書のルート要素が object でなければ
出力される文書の body 要素の内容は何も無い(すなわち、何も表示されない)ことでしょう

xsl:appry-templates を用いれば、このように再帰的にテンプレートルールで比較し
最終的に、全ての一致するノードをテンプレートに変換して出力できます
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="02_002_000.xsl"?>

<object>
	<kitty />
	<line />
	<kitty />
</object>
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:template match="/">
		<html>
			<xsl:apply-templates />
		</html>
	</xsl:template>

	<xsl:template match="object">
		<head></head>
		<body><xsl:apply-templates /></body>
	</xsl:template>

	<xsl:template match="kitty">
		<h1>Kitty on your lap</h1>
	</xsl:template>

	<xsl:template match="line">
		<hr></hr>
	</xsl:template>
</xsl:stylesheet>
サンプルを見る

これは、object ノードの子ノードも処理する XSL スタイルシートです
kitty 要素が発見されれば "Kitty on your lap" という文字列を出力し
line 要素が発見されれば hr 要素を出力してラインを引くという処理を行っています



前のページへ戻る次のページへ