Meigara.xmlよりHTMLを生成しブラウザに表示
まずはNetBeansの[実行]-[主プロジェクトを構築]でプロジェクトをビルドします。NetBeansの左ペインに1つしかプロジェクトが存在しない場合、主プロジェクトは開いているプロジェクトになります。複数のプロジェクトを開いている場合、[実行]-[主プロジェクトとして設定]でJAXPSample1を選択してください。
次に[実行]-[主プロジェクトを実行]を選択すると、index.jspが起動し、初期画面が表示されます。[銘柄リストへ]ボタンをクリックすると図1のような銘柄のテーブルが表示されます。
XSLTSample01スタイルシート解説
JAXPのAPIを使ってXSLTSample01スタイルシートに基づいて変換したらMeigara.xmlがHTMLに変換されました。変換方法を記述しているXSLTSample01スタイルシートを解説します。
xsl:stylesheet要素
3行目のxsl:stylesheet要素によりこのファイルがXSLTスタイルシートであることを宣言しています。名前空間がxslとなっており、これ以降に登場するxslを接頭辞として持つ要素はXSLTの要素ということが分かります。当スタイルシートの場合、xsl:output、xsl:template、xsl:apply-templates、xsl:for-each、xsl:value-of要素が存在します。またXSLTのバージョンが1.0であることを示しています。
xsl:output要素
xsl:outputで出力ツリーに応じた出力形式を指定します。システム開発は新規開発ばかりではありません。古いものに新しいものを付け足したり、積み上げたりすることの方がむしろ多いと言えます。今回の例では、xsl:templateの中で<html>と指定しているので問題ありませんが、古いXSLTプロセッサの場合、XSLTスタイルシートに<head>要素が出現すると自動的にHTMLファイルと認識し<html>要素を出力するものもあれば、変換規則どおり、<head>要素で始まる文書を出力するものもあります。xml以外の形式に変換する場合、xsl:outputで出力形式を指定することをお薦めします。今回はHTMLファイルに変換しますので、method属性の値に"html"と指定します。
xsl:template要素
この要素の内容こそが変換方法を表します。6行目のmatch属性は変換対象のノードを指定します。「/MEIGARAS」と指定していますが、MEIGARASノードはMeigara.xmlの1番上のノードだから「/」で済むのではと考えてもおかしくありません。しかし、「/」はMeigara.xml自体を指すことになります。MEIGARAS要素は「/MEIGARAS」と指定することになります。7行目以降はおなじみのHTML要素を記述しており、このとおりに出力ツリーが生成されます。ただし、19行目にxsl:apply-templates要素が存在するため、これだけで変換が完了するわけではなく、さらに変換することをxsl:apply-templates要素が示しています。
xsl:apply-templates要素
xsl:apply-templates要素や後に説明するxsl:for-each要素はxsl:template内で使用され、XSLT命令と呼ばれます。19行目のxsl:apply-templates要素は次に変換すべきノードを指定します。select属性の値に変換対象のノードを指定しますが、指定しない場合そのノードの子ノードすべてが変換対象とみなされます。Meigara.xmlの場合、MEIGARASノードの子要素はMEIGARAノードだけのため、25行目以降のテンプレートが適用されます。
xsl:for-each要素
xsl:for-each命令はxsl:for-each要素内の変換をノードセットすべてに適用することを指示します。Meigara.xmlにMEIGARAノードは3つあるため、3回xsl:for-each要素内の変換を行うことになります。select属性は3つのノードセットからさらに変換対象を絞り込むために使用します。select属性の値はXPath式である必要があります。「/MEIGARAS/*[.=current()]」がXPath式ですが、/MEIGARAS/*はMEIGARAノードすべてを指定しており、[.=current()]によりループで処理中であるノードであることを特定しています。このようにループ処理中であるノードのことをカレントノードと呼びます。
それに対し、match属性で指定したパターンのノードはコンテキストノードと呼ばれます。なぜ、/MEIGARAS/*のように改めてルートノードから指定しているのか不思議に感じますが、これも古いXSLTプロセッサごとにループ構造の作りが異なるため、ルートノードから指定する方が安全です。ちなみにcurrent()はXSLTの関数の1つです。[.=current()]はXSLTでStepを構成する述語に相当します。要するに/MEIGARAS/*で表されるノードセットのうちカレントノードである場合、この述語は真となります。Stepや述語などの詳細については後編で説明します。
xsl:value-of要素
28行目から31行目のxsl:value-of命令はノードの値を取得するよう指示します。例えばNAMEノードの場合、開始タグと終了タグの間にあるものがノードの値となります。1つ目のノードの場合、「がんこ焼酎屋」が出力されます。
補足
今回はXSLTスタイルシートを作成し、Meigara.xmlからHTMLへ変換しブラウザに表示しました。とにかく実際に見てもらいXSLTに対して持ちがちな「とっつきにくい」という先入観をなくすため、体系的な説明は一切行っていません。XSLTの構造について、少し紹介します。
xsl:stylesheet要素の子要素
次のリストがXSLTスタイルシートの1番上の要素です。今回はxsl:outputとxsl:templateのみ説明しました。
- xsl:attribute-set
- xsl:decimal-format
- xsl:import
- xsl:include
- xsl:key
- xsl:namespace-alias
- xsl:output
- xsl:param
- xsl:preserve-space
- xsl:strip-space
- xsl:template
- xsl:variable