このページの本文へ

XSLTを書いてみよう(2)

XMLの常識

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

文● 及川晴生

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

 前回は<xsl:stylesheet>エレメントまで解説したので、今回はその次に見える<xsl:template>から解説していこう。

 

ドキュメントノード、エレメントノード、テキストノードの3つが階層構造になっている
図1

<xsl:template>はテンプレートを括るためのエレメントで、XSLTはこのテンプレートに記述された内容に従ってXMLの変換を行なっていく。つまり<xsl:stylesheet>同様、<xsl:template>もXSLTに必須のエレメントなのである。この<xsl:template>エレメントには「match」という属性が付けられている。match属性は、テンプレートが適用される部分を指定する属性で、たとえば「match="data"」と記述されていれば、そのテンプレートはdataエレメントに適用されるテンプレートと認識される。さて、今回のサンプルを見てみるとmatch属性の値として「/」と記述されている。XML規格に正しく適合しているXML文書は、必ず図1のようにツリー構造でデータを表わすことができる。このツリー構造の中で、最上位に位置するのがドキュメントノードで、「/」記号はそれを表わすためのもの。なお、「ノード(節)」という言葉を使っているが、これはXMLの一部分を示す言葉で、「ドキュメントノード」とは文書全体を表わす。このほかノードにはエレメントや属性を表わす「エレメントノード」に「アトリビュートノード」、エレメントに括られたテキストを示す「テキストノード」などがある。

 では、<xsl:template match=&quot/&quot>と記述するとどうなるかというと、このエレメントによって括られたものは、「ドキュメントノード(文書全体)にマッチするテンプレート」として処理される。なおXSLTにはテンプレートをいくつ記述してもよいが、処理する順番は図1のようにXMLをツリー構造で見た場合に、もっとも上位に位置するノードに適用されるテンプレートから行なわれる。今回のサンプルでは、<xsl:template match="doc">から始まる、「docエレメント」にマッチするテンプレートも記述されているが、docエレメントよりも上位に位置する「/(ドキュメントノード)」にマッチする<xsl:template match=&quot/&quot>から始まるテンプレートの処理がまず行なわれる。

 このテンプレートの内容だが、中身は<xsl:apply-templates/>というエレメントだけになる。このエレメントは「テンプレートを適用しろ」という命令で、別のテンプレートへと処理を移す場合に利用する。<xsl:apply-templates>には「select」という属性が規定されており、これにテンプレートを適用させたいノードを記述する。たとえば<xsl:apply-templates select="doc"/>と記述すると、「docエレメントにマッチするテンプレートを処理しろ」という命令になる。しかし今回のようにselect属性を記述しなければ、「現在処理しているノードよりも(ツリー構造で見て)下位にあるノードにマッチするテンプレートを処理しろ」ということになり、図1を見れば分かるとおり、今回変換するXML文書で現在テンプレートを適用させているドキュメントノードの下位にある「doc」エレメントノードにマッチするテンプレートへと処理を移すわけだ。

 そのdocにマッチするテンプレートは、直後に記述されている<xsl:template match="doc">から始まる部分になる。このテンプレートの中身を見てみると、まず<文書>というタグがあり続いて<xsl:apply-templates/>、そして</文書>で文書タグが閉じられている。

 <文書>タグだが、XSLTではXSLTのネームスペース(http://www.w3.org/1999/XSL/Transform)に属さないエレメント、つまり今回のXSLTならタグの名前の前に「xsl:」と付いてないものは、そのまま出力される。次の<xsl:apply-templates/>は先に説明したとおり、下位ノードのテンプレートを処理させるためのエレメントである。このテンプレートで処理しているdocエレメントノードの下には、図1を見れば分かるとおりテキストノードが下位ノードとして存在している。しかし、そのテキストノードに適用されるテンプレートはないのだが、XSLTでは「組み込みテンプレート(デフォルトテンプレート)」と呼ばれる、目に見えないテンプレートが存在しており、テキストノードは自動的にそのテキストが結果として出力される。これでdocエレメントに括られたテキストは、そのまま結果へと出力される。

カテゴリートップへ

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

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

ピックアップ