前のページのXSPのサンプルには、
JSPと同じ弱点があります。それはJSPについてさんざん言われているように、
Javaコードが埋め込まれることによって、
ロジックの独立性・再利用性が損なわれてしまっている、
という点です。
JSPの場合、この問題を解決するために、
カスタムタグ・ライブラリを使ってロジックをカスタムタグの中にパッケージ化してしまう、
という方法がとられます。
そして丁度XSPにも、
同じようにロジックをカスタムタグとしてパッケージ化する機構があります。
しかし、それはロジックを.classファイルにコンパイルする
JSPのカスタムタグとは異なり、
なんと、と言いますか、当然のことに、と言いますか、
Javaコードを独立した専用のXSLスタイルシートに書く
というアイデアが採用されています。
この、Javaコードのロジックが埋め込まれたXSLスタイルシートのことを、
XSPロジックシート(Logicsheet)
といいます。
ロジックシートを使ってJavaコードのロジックを呼び出すには、
XML文書の中にロジックシートと対応するタグを書きます。
これは見た感じ、JSPのカスタムタグライブラリ(例えばJakarta Taglibs)
のタグを書いているように見えます。
ただ書いている対象がJSPの場合はHTML文書の中なのに対し、
XSPではXML文書の中である点が異なります。
まず、ロジックを呼び出す側のXML文書(helloworld.xml)です。
ここではhelloという名前空間で定義されている、
hello:hello-worldというロジックを呼び出しています(引数はありません)。
hello名前空間を定義しているXSPロジックシートのURIは、
xml-logicsheet命令で書きます。よく分かりませんが、このように、
XSPロジックシートのURIは
$COCOON_HOME からの相対パスになるようです。
で、
xmlns:hello=のURIは、世界で一意なら何でも構いませんが、
後述のXSPロジックシートでの記述と一致させておく必要があります。
<?xml version="1.0" encoding="Shift_JIS" ?>
<?xml-logicsheet href="./cocoon-test/xsp/logicsheet.hello.xsl"?>
<xsp:page
xmlns:xsp="http://apache.org/xsp"
xmlns:hello="http://urano.dav/examples/hello">
<hello>
ハロー、<hello:hello-world/>ド。
</hello>
</xsp:page>
|
続きましては、その、XSPロジックシート(logicsheet.hello.xsl)であります。
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsp="http://apache.org/xsp"
xmlns:hello="http://urano.dav/examples/hello"
version="1.0">
<xsl:output method="xml" encoding="Shift_JIS" version="1.0"/>
<xsl:template match="xsp:page">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="hello:hello-world">
<xsp:logic>
String msg = "ハロー、ワールド。(Hello World)";
</xsp:logic>
<xsp:expr>
msg
</xsp:expr>
</xsl:template>
<!-- This template simply copies stuff that doesn't match other -->
<!-- templates and applies templates to any children. -->
<xsl:template match="@*|node()" priority="-1">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
|
xsp:pageのテンプレートから上の部分、「This template simply...」
より下の部分は定石ということで使いまわしてOKです。
ということはオリジナルの実体は真ん中のテンプレートだけ…
XSPロジックシートがXSLスタイルシートであることが嫌でも思い出される瞬間であります。
XMLのhello:hello-worldのテンプレートがコイツというわけですね。
で、その、xsp:logicの中にJavaコード、
xsp:exprの中に呼ばれたタグに対応する「値」
となる文字列を書きます。
最後にちょっと混乱するかもしれませんが、
こちらはXSPとは何の関係もない、普通のXSLスタイルシート
(helloworld.xsl)
です。
つまり、先のXSPをかけるとXML文書が出てくるので、
それに対して今度はこのXSLスタイルシートによってXSLT変換を行い、
最終的なXHTML文書が出来上がる、というわけです。
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsp="http://apache.org/xsp"
xmlns:hello="http://urano.dav/examples/hello"
version="1.0">
<xsl:output method="html" encoding="Shift_JIS" version="1.0"/>
<xsl:template match="hello">
<html><body>
<font color="red"><xsl:value-of select="."/></font>
</body></html>
</xsl:template>
</xsl:stylesheet>
|
最後に、sitemap.xmapの書き方です。
<map:match pattern="helloworld.html">
<map:generate type="serverpages" src="helloworld.xml"/>
<map:transform src="helloworld.xsl"/>
<map:serialize type="html"/>
</map:match>
|
(first uploaded 2003/02/02 last updated 2003/03/05, URANO398)
|