XMLからXSLプロセッサを使ってデータを抽出する(Servlet編)

ServletからXSLプロセッサを使う

 XMLデータからXSLを使ってデータ抽出をやってみます. 前回と同様にJavaを使いますが,今回はServletとして作ってみます.

ソフトのダウンロード,セットアップ

 前回のJavaからXSLプロセッサを使うで,

  • JDK 1.2.2
  • XML Parser for Java Ver.2.0.15
  • LotusXSL Ver.0.19.2

はセットアップされているとしますが,Servletを動かすために,さらに

  • JSDK 2.0
  • Apache Web Server 1.3.6
  • Apache Jserv 1.0

と使いました.全てインターネットからダウンロードできます. Servlet Garden を参考にしてください.

3つともインストーラがついていて,簡単にインストールできるのですが, インストール後,設定ファイルをいじる必要があります.

Apache

httpd.confを編集して,ServerNameを設定する必要があります. まあ,何でも良いでしょう.普通はTCP/IPのホスト名として付けている名前かな.

この設定をした時点で,Apache+Apache Jservは正しく動作するはずなので, スタートメニューのStart Apache as Console appを実行して, ブラウザで
http://dell/servlets/IsItWorking
を開くことができるかどうか,動作確認してください. なお,dellというのは僕がServerNameとして指定している名前なので, それぞれの設定によって変わります.

動作確認後,Shutdown Apache console appでApacheを停止します.

Apache JServ

zone.propertiesを編集して,サーブレットを配置するディレクトリを設定します. 例えば,

repositories=E:\kamoi\www\servlet

なおこのzone.propertiesファイルは,rootゾーン用のプロパティファイルです. 別のゾーンを定義して動かす場合は,別のファイルを編集することになります. ちなみに,ゾーンとプロパティファイルの対応付けは,jserv.propertiesで行います.
ゾーンの概念については,Apache Jservのドキュメントで勉強してください.

まあ結果として,例えば ServerName=dell とすると,

http://dell/servlets/testSv
をブラウザで開こうとしたとき,
E:\kamoi\www\servlet\testSv.class
が実行されるようになります.

次に,参照するJavaアーカイブのパスを,jserv.propertiesに記述します. 例えば,こんな感じです.

jserv.properties

wrapper.classpath=D:\Program Files\Apache Group\Apache JServ\ApacheJServ.jar
wrapper.classpath=D:\jsdk2.0\lib\jsdk.jar
wrapper.classpath=D:\xml4j_2_0_15\xml4j.jar
wrapper.classpath=D:\lotusxsl_0_19_2\lotusxsl.jar
wrapper.classpath=D:\lotusxsl_0_19_2\xerces.jar

このあたりの設定で,1週間ぐらい悩んでしまいました.


XML,XSLファイルの準備

アルバムデータ用のXMLファイルは,前回と同じものです.

albums.xml

<?xml version="1.0" encoding="Shift_JIS"?>

<albums>
<album>
<band>AION</band>
<title>Aionism</title>
<comment></comment>
</album>
<album>
<band>ALCATRAZZ</band>
<title>Alcatrazz</title>
<comment>Yngwieのギターが速いぞ</comment>
</album>
<album>
<band>AMORPHIS</band>
<title>Elegy</title>
<comment></comment>
</album>
</albums>

データ抽出用XSLファイルには,抽出用のパラメータbandと, 抽出条件<xsl:if>が導入されています.

albums.xsl

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:param name="band"/>

<xsl:template match="/">
    <HTML>
        <HEAD>
            <TITLE>アルバム</TITLE>
        </HEAD>
        <BODY>
            <TABLE BORDER="1">
                <TR>
                    <TD>バンド</TD>
                    <TD>アルバム名</TD>
                    <TD>コメント</TD>
                </TR>
                <xsl:for-each select="albums/album">
                    <xsl:if test="band = $band">
                        <TR>
                            <TD>
                                <xsl:value-of select="band"/>
                            </TD>
                            <TD>
                                <xsl:value-of select="title"/>
                            </TD>
                            <TD>
                                <xsl:value-of select="comment"/>
                            </TD>
                        </TR>
                    </xsl:if>
                </xsl:for-each>
            </TABLE>
        </BODY>
    </HTML>
</xsl:template>
</xsl:stylesheet>


サーブレットプログラム

XmlTestSv1.java

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.xml.sax.SAXException;
import org.apache.xalan.xslt.XSLTProcessorFactory;
import org.apache.xalan.xslt.XSLTProcessor;
import org.apache.xalan.xslt.XSLTInputSource;
import org.apache.xalan.xslt.XSLTResultTarget;


public class XmlTestSv1 extends HttpServlet
{
    public void doGet(
        HttpServletRequest request,
        HttpServletResponse response)
        throws IOException, ServletException
    {
        try
        {
            doGetPost( request, response);
        } catch ( Exception e)
        {
            response.setContentType( "text/plain; charset=Shift_JIS");
            e.printStackTrace( response.getWriter());
        }
    }

    public void doPost(
        HttpServletRequest request,
        HttpServletResponse response)
        throws IOException, ServletException
    {
        try
        {
            doGetPost( request, response);
        } catch ( Exception e)
        {
            response.setContentType( "text/plain; charset=Shift_JIS");
            e.printStackTrace( response.getWriter());
        }
    }

    public void doGetPost(
        HttpServletRequest request,
        HttpServletResponse response)
        throws IOException, ServletException, SAXException
    {
        response.setContentType( "text/html; charset=Shift_JIS");
        PrintWriter out = response.getWriter();

        String bandName = "";

        Enumeration params = request.getParameterNames();
        while ( params.hasMoreElements())
        {
            String name = (String)params.nextElement();
            String value = request.getParameter( name);

            if ( name.equals( "band"))
            {
                bandName = value;
            }
        }

        if ( bandName.equals( ""))
        {
            showQueryForm( out);
            return;
        }

        try
        {
            XSLTInputSource xmlId = new XSLTInputSource( "E:\\kamoi\\www\\Servlet\\albums.xml");
            XSLTInputSource xslId = new XSLTInputSource( "E:\\kamoi\\www\\Servlet\\albums.xsl");
            XSLTResultTarget resultTarget = new XSLTResultTarget( out);

            XSLTProcessor processor = XSLTProcessorFactory.getProcessor();

            processor.setStylesheetParam( "band", "'" + bandName + "'");

            processor.process( xmlId, xslId, resultTarget);

        } catch ( Exception e)
        {
            e.printStackTrace(out);
        }
    }

    private void showQueryForm(
        PrintWriter out)
    {
        out.println( "<HTML><HEAD></HEAD><BODY>");
        out.println( "<H1>バンド名入力</H1>");
        out.println( "<FORM ACTION=\"XmlTestSv1\" method=\"POST\">");
        out.println( "<INPUT NAME=\"band\" type=\"text\">");
        out.println( "<P>");
        out.println( "<INPUT TYPE=\"submit\">");
        out.println( "</FORM>");
        out.println( "</BODY></HTML>");
    }
}

実際に処理をしているメソッドは,doGetPost()と, showQueryForm()です.

showQueryForm()は,検索条件としてのバンド名入力フォームの作成を行い, doGetPost()は,入力されたバンド名をXSLのパラメータとして与えて,XSLプロセッサに渡します.


実行例

XmlTestSv1をブラウザから開くと,バンド名入力画面が表示されます. この画面はshowQueryForm()で作っています.

バンド名入力画面

バンド名を入力して,ボタンをクリックすると, 入力したバンド名に一致するアルバムデータが表示されます.

検索結果画面


© 2024 KMIソフトウェア