CodeZine(コードジン)

特集ページ一覧

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

まずはXPathとXSLTの理解から

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

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

目次

実際に変換する

変換するための準備

 「JAXPとは何か」では抽象的な表現を使いましたが、XSLTを例にすると、XSLTスタイルシートを使うにはXSLTプロセッサが必要です。XSLTプロセッサとは実際にXSLTスタイルシートの規則を適用し、変換を行うものです。JDBCがRDBの違いを、JMSがMOM製品の違いを、JPAがO/Rマッパーの違いを吸収してくれるのと同じく、JAXPもXSLTプロセッサの違いを吸収し、XSLTプロセッサを意識することなくコーディングできるようになっています。

 今回はJAXPのAPIをSerlvet上に記述するため、WebアプリケーションサーバであるGlassFishを使います。開発環境は皆さんの使い慣れたものを使ってください。今回はNetBeansを使って説明します。

 GlassFishとNetBeansは「GlassFishとNetBeansのインストール」を参考にインストールしてください。XSLTプロセッサのインストールは必要ありません。

プロジェクトを作成

 Eclipseなどの開発ツールをご使用の方は同等の操作をお願いします。NetBeansでプロジェクトを作成するには[ファイル]-[新規プロジェクト]を選択すると[新規プロジェクト]画面が開きます。[カテゴリ]のリストから「Java Web」を選択するとプロジェクトに複数の選択肢が表示されます。今回、JAXPのAPIはServlet内に記述するため「Web アプリケーション」を選択します。[プロジェクト名]に「JAXPSample1」を入力し[次へ]ボタンをクリックします。[コンテキストパス]は入力可能ですが、そのままで構いません。今回はフレームワークは使わないため、[次へ]ボタンではなく[完了]ボタンをクリックします。NetBeansの左ペインにJAXPSample1というプロジェクトが作成されているはずです。

XMLからHTML変換するクラスを実装

 では、JAXPのAPIを使ってMeigara.xmlファイルをHTMLファイルに変換しブラウザに表示するためのServletを作成します。JAXPSample1プロジェクトを右クリックし、[新規]-[サーブレット]を選択します。[サーブレット]が選択肢にない場合、[その他]から[サーブレット]を選択してください。エディタが右ペインに開きます。詳細な説明は後述するので、まずはリスト3のように入力するか、ページトップにあるサンプルコードのNonAttributeServlet.javaの内容をコピー&ペーストしてください。

リスト3.NonAttributeServlet.java抜粋
001:package jp.kawakubo;
002:
003:import java.io.IOException;
004:import java.io.PrintWriter;
005:import javax.servlet.ServletException;
006:import javax.servlet.http.HttpServlet;
007:import javax.servlet.http.HttpServletRequest;
008:import javax.servlet.http.HttpServletResponse;
009:import javax.xml.transform.Transformer;
010:import javax.xml.transform.TransformerConfigurationException;
011:import javax.xml.transform.TransformerException;
012:import javax.xml.transform.TransformerFactory;
013:import javax.xml.transform.stream.StreamResult;
014:import javax.xml.transform.stream.StreamSource;
015:
016:/**
017: *
018: * @author tomoharu
019: */
020:public class NonAttributeServlet extends HttpServlet {
021:
022:    private static final String XSLT_PATH = "file:///Users/tomoharu/Documents/XSLSample/XSLTSample01.xsl";
023:    private static final String SOURCE_PATH = "file:///Users/tomoharu/Documents/XMLSample/Meigara.xml";
024:   
025:    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
026:    throws ServletException, IOException {
027:
028:        response.setContentType("text/html; charset=UTF-8");
029:        PrintWriter pw = response.getWriter();
030:
031:        try {
032:            TransformerFactory transformerFactory = TransformerFactory.newInstance();
033:            Transformer transformer = transformerFactory.newTransformer(new StreamSource(XSLT_PATH));
034:            StreamSource ss = new StreamSource(SOURCE_PATH);
035:            StreamResult sr = new StreamResult(pw);
036:            // Meigara文書をXSTSample01スタイルシートでHTMLファイルに変換
037:            transformer.transform(ss, sr);
038:        } catch (TransformerConfigurationException tce) {
039:            tce.printStackTrace();
040:        } catch (TransformerException te) {
041:            te.printStackTrace();
042:        } catch (Exception e) {
043:            e.printStackTrace();
044:        }
045:    }

 非常にシンプルなコードで驚かれた方も多いと思います。順に説明します。

  • 22行目でXSLTスタイルシートのパスを、23行目でXML文書のパスを指定しています。
  • 32行目で実際に変換を行うTransformerを生成するためのTransformerFactoryを生成しています。
  • 33行目でTransformerFactoryからTransformerオブジェクトを生成しています。引数は22行目で指定したパス名より生成したStreamSourceオブジェクトです。
  • 34行目で変換対象のXML文書を引数としてStreamSourceを生成しています。DOMやSAXを扱う場合、DOMSourceやSAXSourceとなります。
  • 35行目はPrintWriterを引数にStreamResultを生成しています。入力同様、出力もDOMやSAXの場合、DOMResultやSAXResultとなります。
  • 36行目でTransformerのtransformメソッドを使い、入力ツリーを出力ツリーに変換しています。XSLTの場合、ノード(要素や属性など)から構成されるツリーを変換対象とするため文書とは呼ばずツリーと呼ばれます。transformメソッドの第1引数が入力ツリーで、第2引数が出力ツリーです。第1引数の型はSourceインターフェースでSreamSource、DOMSource、SAXSourceがその具象クラスです。第2引数の型はResultインターフェースでStreamResult、DOMResult、SAXResultが具象クラスです。目的に応じインスタンス化したものを引数に渡す必要があります。今回はStreamSourceとStreamResultを使用しています。ここは難しく考えず、変換元がSource、変換後がResultという器に入っていると考えてください。

Servletを呼び出すJSPを記述

 [プロジェクトを作成]で[Web アプリケーション]を選択しましたが、プロジェクト作成後、JAXPSample1のWebページの直下にindex.jspがデフォルトで作成されるので、リスト4のように書き換えます。

リスト4.index.jsp
001:<%@page contentType="text/html" pageEncoding="UTF-8"%>
002:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
003:   "http://www.w3.org/TR/html4/loose.dtd">
004:
005:<html>
006:    <head>
007:        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
008:        <title>XSLTテスト1</title>
009:    </head>
010:    <body>
011:        <h1>XSLTのテスト(ソースXMLに属性がない場合)</h1>
012:        <form action="/JAXPSample1/NonAttributeServlet">
013:            <input type="submit" value="銘柄リストへ"/>
014:        </form>
015:    </body>
016:</html>

 以上で、準備は整いました。


  • 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