XMLをIEで表示(基礎編): XSLTによる変換の流れ(3)

2006年05月07日(日)更新


■変換するXMLデータ(例)

たけち: 今回は具体例で変換の様子を詳しく見てみようね。前回のXMLデータをもう一度見てみよう。ツリーチャートもね。

さらら: は〜い。

XMLデータ例: 万葉歌の例 【manyo.xml】

<?xml version="1.0" encoding="Shift_JIS"?>
<manyosyu>
<volume no="1">
  <poem>
    <poet>額田王(ぬかたのおおきみ)</poet>
    <yomi>
    熟田津に船乗りせむと月待てば潮もかなひぬ今は漕ぎ出でな
    </yomi>
  </poem>
  <poem>
    <poet>中大兄(なかのおおえ)</poet>
    <yomi>
    海神の豊旗雲に入日さし今夜の月夜さやけくありこそ
    </yomi>
  </poem>
</volume>
</manyosyu>

manyo.xmlのツリーチャート

たけち: じゃあ、このXMLデータの中の、yomi要素の内容、つまり
 熟田津に船乗りせむと月待てば潮もかなひぬ今は漕ぎ出でな
 海神の豊旗雲に入日さし今夜の月夜さやけくありこそ

だけを取り出して表示することにしようね。

さらら: 歌の読みだけを取り出すのね。

たけち: そうだね。この場合の変換対象は、どのノードになるかな。

さらら: えっ、と。。。この部分ね。

変換対象となるノード


■変換後のHTMLを考える

たけち: そうだね。で、結果として生成したいHTMLを考えてみよう。

さらら: あっ、簡単なのにしてね。(^ ^*

たけち: あっ、もちろんだよ。。。。こんな風にしてみようかな。

※変換後のHTML

<html>
<head>
<title>XSLTサンプル : xsl:template</title>
</head>
<body>
<p>■変換の流れ manyo.xmlのyomi要素のテキストを表示</p>

<p>熟田津に船乗りせむと月待てば潮もかなひぬ今は漕ぎ出でな</p>
<p>海神の豊旗雲に入日さし今夜の月夜さやけくありこそ</p>

</body>
</html>

さらら: あっ、これなら簡単なHTMLだからわかるわ。もとのXMLデータから、poem要素の内容をHTMLのp要素の内容に変換するわけなのね。

たけち: そうそう。この変換を次の図で確認してみようね。

XMLデータをHTMLに変換する

さらら: XMLデータと変換後のHTMLとの関係はわかったわ。で、。。。。。(^ ^;

たけち: うん。で、この変換を指示するのがXSLTスタイルシートのテンプレート(template)、っていうことなんだね。ちなみに、templateは、ひな型という意味だね。

さらら: そっか。。。このテンプレートをどう書くのか、ということなのね。

たけち: そうなんだね。それから、変換前のXMLデータのツリー構造をソースツリー、そして変換後のデータのツリー構造を結果ツリーって言ったりするから、覚えておいてね。
じゃあ、次にこのXMLデータからHTMLへの変換を指示するテンプレートの例をみてみよう。

さらら: あっ、はい。


■XSLTスタイルシートの例とテンプレート

※XSLTスタイルシート例

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0"
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
    <html>
    <head>
    <title>XSLサンプル : xsl:template</title></head>
    <body>
    <p>■変換の流れ manyo.xmlのyomi要素のテキストを表示</p>

    <xsl:apply-templates />

    </body>
    </html>
</xsl:template>

<xsl:template match="poem">
    <p><xsl:value-of select="yomi" /></p>
</xsl:template>

</xsl:stylesheet>

たけち: このXSLTスタイルシートにはテンプレート(template)が二つあるんだ。どれかわかるかな。

さらら: え〜っと。。。
<xsl:template match="/">
で始まるテンプレートと
<xsl:template match="poem">
    <p><xsl:value-of select="yomi" /></p>
</xsl:template>
というテンプレートね。

たけち: そうだね。で、最初の
<xsl:template match="/">
で始まるテンプレートは、元のXMLデータのツリーのルートノードに対するテンプレートなんだ。

さらら: あっ、そうなの。

たけち: match="/"ルートノードに対するテンプレートだということを示しているんだ。"/"ルートノードを示しているって事を説明したよね。


■<xsl:value-of select="yomi" />

さらら: あっ、じゃあ
<xsl:template match="poem">
で始まるテンプレートは、ノードpoemに対するテンプレートだということを示しているのね!!

たけち: そうなんだ。で、そのテンプレートには、
    <p><xsl:value-of select="yomi" />
と書かれているね。
これは、ノードyomiの内容を取得する、ということを指示しているんだ。

さらら: そういうことなんだぁ〜。それで、歌の内容(文字列)が。。。。あれ? でも、この二つのテンプレートって、どう働くの? それに、歌は二つなのにテンプレートはひとつでしょ???


■XSLTプロセッサの処理の流れ

たけち: じゃあ、まず、XSLTプロセッサの処理の流れを説明しておくね。基本的には次のようになっているんだ。

(1) ソースXMLツリー中の各ノードに対して適用できるテンプレートを選択する。
(2) 選択されたテンプレートがあれば、そのテンプレートに記述されているルールにしたがって結果ツリーを生成する。
(3) (1)〜(2)を、ソースXMLツリーのルートノードから開始し、全てのノードについて行う。

さらら: う〜ん。。なんか、わかんない!!

たけち: うん。この例でみてみようね。まず、
 @ソースXMLツリーのルートノードに適用できるテンプレートがあるかどうか
をみるんだ。そうすると。

さらら: あっ、あるわ!!

たけち: で、ルートノードに対するテンプレートによって

    <html>
    <head>
    <title>XSLサンプル : xsl:template</title></head>
    <body>
    <p>■変換の流れ manyo.xmlのyomi要素のテキストを表示</p>

    <xsl:apply-templates />

    </body>
    </html>

というHTMLが生成されるんだね。


■<xsl:apply-templates />

さらら: なるほど。。。でも、
    <xsl:apply-templates />
ってなぁに?

たけち: うん。これは、この個所にさらに子ノードに一致するテンプレートによる変換結果をここに入れてくださいということなんだ。

さらら: へぇ。

たけち: で、XSLTプロセッサは、
 Aさらに子ノードに適用できるテンプレートがあるかどうか

 B図に示す順序で最後のノードまで
見てゆくんだ。

ノードの探索とテンプレートの選択

さらら: あっ、そっか。ソースXMLデータには、poem要素がふたつあるから、それぞれが見つかる都度、ノードpoemに対するテンプレートが適用されるのね。

たけち: そうなんだね。だから、ふたつの歌(ノードpoemの子ノードyomiの内容)がHTMLのノードpの内容に変換されるんだね。

さらら: わかったわ!!

たけち: よかった。じゃあ、今回はこれでおしまい。次からは色々なテンプレートを作りながら学んでいこうね。。

さらら: あっ、は〜い。

→次回につづきます。 (^ ^)v