Cocoon2とXSP

 前のページの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>

Baykit and Cocoon Top

(first uploaded 2003/02/02 last updated 2003/03/05, URANO398)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル