「XML配信の基礎」のページで、少しだけXML文書の配信の例をご紹介しました。
今度はそれを発展というか、延長させてみます。
$DOC_HOME/sitemap.xmapの一部です。
<map:match pattern="**/index.xml">
<map:generate src="{1}/index.xml"/>
<map:transform type="xslt" src="./common/index.xsl" />
<map:serialize type="html"/>
</map:match>
<map:match pattern="**/menu.xml">
<map:generate src="{1}/menu.xml"/>
<map:transform type="xslt" src="./common/menu.xsl" />
<map:serialize type="html"/>
</map:match>
<!-- Q&A方式のXML文書はkomaを名前につけます。-->
<map:match pattern="(.*)/koma(.*)\.xml" type="regexp">
<map:generate src="{1}/koma{2}.xml"/>
<map:transform type="xslt" src="./common/koma.xsl" />
<map:serialize type="html"/>
</map:match>
<map:match pattern="**.xml">
<map:generate src="{1}.xml"/>
<map:transform type="xslt" src="./common/simple.xsl" />
<map:serialize type="html"/>
</map:match>
|
この例では、「index.xml」を要求されたら「index.xml」と「./common/index.xsl」
によってHTML文書を生成して返す、という動作を指示しています。
menu.xmlも同様です。
この./common/index.xslのような相対ディレクトリの起点はこのsitemap.xmap
がある場所になります。
つまりここでは $DOC_HOME/common/index.xsl
というパスからこのXSLスタイルシートを読もうとすることになります。
ここでは要求されるURLの拡張子として.xmlを想定していますが、
そうでなく、index.htmlというURLが要求されたときに、
index.xmlとindex.xslを合成して返しても構いません
(前の例ではそうでした)。要求されたURL、
index.htmlは実際に存在している必要はありません。
Cocoonの動作上は、要求されるURLは完全に仮想的なものです。
従って、index.xmlやindex.htmlでなく、例えば welcome.doc
というURLが要求されて index.xmlとindex.xslを合成することも可能です。
次のkomaなにがし.xmlというパターンはちょっと変わっていて、
通常のwildcard URI matcherの代わりに、
regexp URI matcherを使っています。
これはtype="regexp"で指定しています。
wildcardとの違いは読んで字のごときしあわせ、
パターンをワイルドカードではなくPerlチックな正規表現で指定できることです。
拡張子の.(ドット)は、\文字1コでエスケープできます。
で、Perl言語において、正規表現中で括弧で囲んだ部分文字列が、
その後続処理で$1、$2…として参照できるのと全く同様に、
ここでは{1}、{2}…として参照できます。
最後に上のindex.xml、menu.xml、koma*.xmlのどれにも当てはまらなかった
*.xml については、simple.xsl で整形して配信するように指示しています。
パターンは上から順番に照合されるので、*.xmlという最も広範囲にマッチするパターンは、
一番最後に書く必要があります。
Cocoonの内部動作で??な点があったら、サーブレットコンテナのログではなく、
Cocoon自身が出すログを見るとよいでしょう。
Cocoonのログは $COCOON_HOME/WEB-INF/logs に出力されるようになっています。
変換中にエラーが発生した場合、
普通に表示されるエラーメッセージでは、なかなか原因が把握しづらいのが困りもの。
そこで、Cocoonに最初からついている
error2html.xslを使うと、
エラー発生時により詳細な情報がブラウザに表示されます。
$DOC_HOME/sitemap.xmap の最後に次のような記述をします。
<map:handle-errors>
<map:transform src="./common/error2html.xsl"/>
<map:serialize type="html" status-code="500"/>
</map:handle-errors>
|
このファイルerror2html.xslは、
$COCOON_HOME/samples/common/style/xsl/html
に置かれているので、これをコピーしてsitemap.xmapで指定した場所に置きます。
(first uploaded 2003/01/26 last updated 2003/01/26, URANO398)
|