XMLからXSLプロセッサを使ってデータを抽出する(Servlet編) ServletからXSLプロセッサを使うXMLデータからXSLを使ってデータ抽出をやってみます. 前回と同様にJavaを使いますが,今回はServletとして作ってみます.
ソフトのダウンロード,セットアップ前回のJavaからXSLプロセッサを使うで,
はセットアップされているとしますが,Servletを動かすために,さらに
と使いました.全てインターネットからダウンロードできます. Servlet Garden を参考にしてください. 3つともインストーラがついていて,簡単にインストールできるのですが, インストール後,設定ファイルをいじる必要があります.
Apachehttpd.confを編集して,ServerNameを設定する必要があります. まあ,何でも良いでしょう.普通はTCP/IPのホスト名として付けている名前かな.
この設定をした時点で,Apache+Apache Jservは正しく動作するはずなので,
スタートメニューのStart Apache as Console appを実行して,
ブラウザで 動作確認後,Shutdown Apache console appでApacheを停止します. Apache JServzone.propertiesを編集して,サーブレットを配置するディレクトリを設定します. 例えば, repositories=E:\kamoi\www\servlet
なおこのzone.propertiesファイルは,rootゾーン用のプロパティファイルです.
別のゾーンを定義して動かす場合は,別のファイルを編集することになります.
ちなみに,ゾーンとプロパティファイルの対応付けは,jserv.propertiesで行います.
まあ結果として,例えば 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()で作っています.
![]() バンド名を入力して,ボタンをクリックすると, 入力したバンド名に一致するアルバムデータが表示されます.
![]() |