SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

まずはXPathとXSLTの理解から


  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード サンプルコード (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

次のページ
サンプルコード

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
今からでも遅くない、JAXPを学ぼう!連載記事一覧
この記事の著者

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5137 2010/05/31 16:41

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング