CodeZine(コードジン)

特集ページ一覧

今からでも遅くない JAXPを学ぼう!(前編)
XPathとXSLTを体験する

まずはXPathとXSLTの理解から

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2010/05/31 14:00

ダウンロード サンプルコード (3.2 KB)

目次

Meigara.xmlよりHTMLを生成しブラウザに表示

 まずはNetBeansの[実行]-[主プロジェクトを構築]でプロジェクトをビルドします。NetBeansの左ペインに1つしかプロジェクトが存在しない場合、主プロジェクトは開いているプロジェクトになります。複数のプロジェクトを開いている場合、[実行]-[主プロジェクトとして設定]でJAXPSample1を選択してください。

 次に[実行]-[主プロジェクトを実行]を選択すると、index.jspが起動し、初期画面が表示されます。[銘柄リストへ]ボタンをクリックすると図1のような銘柄のテーブルが表示されます。

図1.実行結果画面
図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

  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:今からでも遅くない、JAXPを学ぼう!

著者プロフィール

  • 川久保 智晴(カワクボ トモハル)

    haruプログラミング教室(https://haru-idea.jp/)主宰。 COBOL、FORTRANで13年、Javaを中心としたWeb開発で11年。3つしか言語知らないのかというとそうでもなく、sed/awk、Perl、Python, PHP, &nbsp;C#, JavaScript...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5