Jakarta TaglibsのXTagsタグライブラリ |
今度は、JSP文書の中でXML文書を解析したり、XSLT変換をかけたりする、
XTagsというタグライブラリを使ってみます。
これを使うとああ、なんと!(大げさだなあ)
XSLTよりももっと柔軟性の高いXML処理が可能です。
例えばXSLスタイルシートを用意しなくても、
JSP文書の中でXSLTっぽいタグを使って、
XML文書からHTML文書を生成することができます。
単純なXSLTよりも、
もう少しWebアプリケーション的なロジックが複雑な場合に威力を発揮することでしょう。
以下の説明では、タグライブラリを使いたいWebアプリケーションの基点ディレクトリを
$APP_HOME と表記します。
●セットアップ手順
-
XTagsを使うには、Java言語でXML文書を扱うためのオープンソースフレームワーク、
dom4j
のライブラリ(Jarファイル)が必要です。
上記のホームページからアーカイブ
dom4j-1.3.zip をダウンロードし、適当なディレクトリで展開します。
展開したディレクトリに dom4j.jar と dom4j-full.jar
があるので、普通は dom4j.jar
を選んで、 $APP_HOME/WEB-INF/lib にコピーします。
-
Jakarta Taglibs のアーカイブから、
xtags ディレクトリの taglibs-xtags.jar を
$APP_HOME/WEB-INF/lib にコピーします。
-
jakarta-taglibs/xtags/jakarta-xtags.tld を
$APP_HOME/WEB-INF にコピーします。
-
$APP_HOME/WEB-INF/web.xmlを編集して、
次の記述を書き加えます。
<taglib>
<taglib-uri>http://jakarta.apache.org/taglibs/xtags-1.0</taglib-uri>
<taglib-location>/WEB-INF/taglibs-xtags.tld</taglib-location>
</taglib>
|
●XTagsタグを使った「XSLTもどき」
ここで扱うXML文書のお題は、
別のページからの使いまわしです。(-_-)
あ、いやいや、つまり、下のような、業務システムのトラブル対応、
または臨時処理を記録した文書と考えてください。
ファイル名は「uylog.xml」とします。
<?xml version="1.0" encoding="euc-jp" ?>
<document>
<title>作業履歴</title>
<entry>
<entry-date>2003/03/06</entry-date>
<system>勤務管理システム</system>
<status>対応完了</status>
<target>PG0032</target>
<description>
記録…(省略されました)
</description>
</entry>
<entry>
<entry-date>2003/03/06</entry-date>
<system>会議室予約システム</system>
<status>対応完了</status>
<target>PG0397</target>
<description>
記録…(省略されました)
</description>
</entry>
</document>
|
このXML文書を解析して、
各エントリ(entry)をHTMLのテーブル形式にするサンプルです。
<%@ page language="java" contentType="text/html;charset=Shift_JIS" %>
<%@ taglib uri="http://jakarta.apache.org/taglibs/xtags-1.0" prefix="xtags" %>
<html><body>
<font color="#700040">●Jakarta Taglibs XTagsライブラリのテスト</font><br>
<table border="1">
<xtags:parse uri="uylog.xml" />
<!-- xtags:parse はここで閉じるのに注意。以下を囲む必要はありません。 -->
<!-- XML文書のエンコーディングはShift_JISやEUC-JPでも良い -->
[<xtags:valueOf select="/document/title"/>]
<xtags:forEach select="/document/entry">
<tr>
<td><xtags:valueOf select="entry-date"/></td>
<td><xtags:valueOf select="system"/></td>
<td><xtags:valueOf select="target"/></td>
</tr>
</xtags:forEach>
</table>
</body></html>
|
冒頭のtaglib擬似命令の使い方は、
もうこの通りということでよいでしょう。
また、この文書自体のエンコーディングは例のようにShift_JISや
EUC_JPでもOKです。UTF-8でないと処理できない、ということはありません。
で、処理の本体はxtags:parse
タグで、これによってXML文書を解析して文書オブジェクトとして格納します。
注意点はコメントにも書いているように、
xtags:parseタグは以降の処理を囲む必要はなく、
ここで閉じて構わないということです。
囲んでしまうと中身が出力されないので、延々悩みます…ので要注意!
そして、解析した文書オブジェクトの内容はというと、
サンプルのようにxtags:valueOfや、
xtags:forEachのような
XSLTを知っているとなんとな〜く機能が推測できそうな名前のタグで処理できます。
これらのタグでselect=で指定するのは、もちろんXPath式です。
つまり、xtags:valueOfやxtags:forEachなどのタグは、
XSLTのxsl:value-ofやxsl:for-eachなどのタグとそれぞれほとんど同じ使い方と覚えればよいでしょう。
●本物のXSLTもできます。
XTagsタグライブラリには、xtags:style
という、XSLスタイルシートを適用してHTML文書を生成する、
つまりXSLT変換を行うタグもあります。
今度は、これを使ってみます。
そのためのXSLスタイルシートをまず用意しましょう。
「uylog.xsl」と名づけます。
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html" encoding="Shift_JIS" version="1.0"/>
<xsl:template match="/document">
<table border="1">
<tr bgcolor="#cccccc"><td>発生日</td><td>システム</td><td>対象処理</td></tr>
<xsl:for-each select="entry">
<tr>
<td><xsl:value-of select="entry-date"/></td>
<td><xsl:value-of select="system"/></td>
<td><xsl:value-of select="target"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
|
HTMLのテーブル形式に整形しているだけですが、
<html>タグや<body>タグがない点をチェックしておいてくださいね。
<%@ page language="java" contentType="text/html;charset=Shift_JIS" %>
<%@ taglib prefix="xtags" uri="http://jakarta.apache.org/taglibs/xtags-1.0" prefix="xtags" %>
<html><body>
<font color="#700040">●Jakarta Taglibs XTagsライブラリによる
XSLT変換のテスト</font><br>
<xtags:style xml="uylog.xml" xsl="uylog.xsl">
</xtags:style>
<!-- HTML/BODYタグをこちらに書く場合、上のスタイルシートには
HTML/BODYタグは書かない -->
</body></html>
|
そしてそのタグライブラリを使ったJSP文書です。
xtags:styleタグで、
xml=属性でXML文書のURIを、xsl=属性でXSLスタイルシートのURIを指定するだけで、
XSLT変換によって生成されたHTML文書をこの位置に挿入することができます。
XSLスタイルシートに<html>タグや<body>タグがないのは、
これらのタグを既にJSP側に書いてあって、
その間の部分だけを生成すればよいからです。
なお、スタイルシートにパラメータを渡したい場合には、
xtags:styleタグの間に、
xtags:paramタグを使って指定できます。
使い方はXSLTのxsl:paramタグとほぼ同じです。
●XTagsのELからJSP変数へのアクセス
XTagsのxtags:ifなどのXPathを使うタグの式構文(EL)の中で、
JSP変数にアクセスできます。
詳しくはXTagsのドキュメントに載っていますが、
pageスコープの変数moにアクセスするには $moまたは $page:mo、
リクエストパラメータの変数moは $param:mo、
セッション変数moは $session:mo のような感じで参照できます。
ただしこの構文はJSTLのELとは互換性がないので注意が必要です。
例えばELではセッション変数moにアクセスするには ${param.mo} のように書きます。
なお、JSP変数へのアクセスはXPathを扱う式構文以外では使えません。
例えば、xtags:parse タグのuriの属性にJSP変数の値を参照することはできません。
これに気づいたときは結構がっくり、でした。
(first uploaded 2003/03/10 last updated 2003/08/15, URANO398)
|