このページの本文へ

XSLTを書いてみよう(2)

XMLの常識

2000年08月29日 14時55分更新

文● 及川晴生

  • この記事をはてなブックマークに追加
  • 本文印刷

 テキストが出力されたあと、処理は<xsl:apply-templates/>の部分に移される。というのも、XSLTでのテンプレートの処理の行き来はすべて再帰的に行なわれるためで、1つのテンプレートの処理を終えると、そのテンプレートへと処理が移ったところへ戻ることになる。つまりここでは<xsl:template match="doc">テンプレートの中にある<xsl:apply-templates/>の部分へと戻るわけだ。ここで次にあるのは</文書>というタグで、これもXSLTネームスペースに属していないので、そのまま結果へ出力される。このテンプレートの、ここまでの作業の流れを追ってみると、

  1. <文書>タグを出力
  2. 下位ノード(テキストノード)のテンプレートである組み込みテンプレートへと処理が飛ぶ
  3. docエレメントノードの下にあるテキストノードをそのまま出力
  4. </文書>タグを出力

というようになる。これによって、以下のような結果がこのテンプレートによって出力される。


<文書>
(docエレメントで括られたテキスト)
</文書>

 さて、これでdocエレメントノードにマッチするテンプレートの処理が終わった。テンプレートは再帰的に処理されるので、このテンプレートへ移したエレメントである<xsl:template match="/">の中の<xsl:apply-templates/>の部分へと処理が戻る。これで「/(ドキュメントノード)」にマッチするテンプレートの処理も終わり、すべてのテンプレートの処理が終わったため、めでたくXML文書<doc>(テキスト)</doc>を、<文書>(テキスト)</文書>というようにタグの名前の変換が行なえたわけだ。今回のXMLとXSLTをXSLTプロセッサを使って変換を行なうと、以下のように出力される。


<?xml version="1.0&quot?>
<文書>
これはテキストです
</文書>

 なお今回は、<doc>エレメントノードの下にはテキストノードしかなかったため、テキストノードを処理する組み込みテンプレートルールが適用されたが、もし以下のようになっていた場合はどうなるのだろうか。


<doc>これは<bold>テキスト</bold>です</doc>

 select属性のない<xsl:apply-templates/>エレメントは、下位ノードすべてに対応するテンプレートを適用しようとするので、テキストノードに加えて<bold>エレメントノードのテンプレートも探そうとするが、しかしそのテンプレートは存在しない。このような場合、やはり組み込みテンプレートルールによってその内容が自動的に<xsl:apply-templates/>され、その下のテキストノードが自動的に結果として出力される。そのため、やはり<文書>これはテキストです</文書>と出力される。<bold>というタグを<強調>タグに変えたいのなら、以下のようなテンプレートを書き加えておけばよい。


<xsl:template match="bold">
<強調>
<xsl:apply-templates/>
</強調>
</xsl:template>

 これで、<xsl:apply-templates/>はboldに対応するテンプレートとして上記のテンプレートを適用し、<xsl:template match="doc">と同じように<bold>エレメントの中にあるテキストを<強調>~</強調>で括った形で出力する。基本的には、タグが増えてもそれに対応するテンプレートを記述しておけば、期待する形で出力できる。

カテゴリートップへ

アスキー・ビジネスセレクション

ASCII.jp ビジネスヘッドライン

ピックアップ