Cocoon2によるXML基礎の配信

 「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のログは $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で指定した場所に置きます。

Baykit and Cocoon Top

(first uploaded 2003/01/26 last updated 2003/01/26, URANO398)

楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル