コンテンツの作成

XMLファイルの作成

処理対象の XML は well-formed であればどのようなスキーマでも扱うことが出来ます。XML ファイルは通常の HTML ファイルと同様にサイト内に配置します。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="product.xsl"?>
<products>
    <product id="0001" category="Kitchen" name="Caffee Cup" />
    <product id="0002" category="Kitchen" name="Sauser" />
    <product id="0003" category="Kitchen" name="Fork" />
    <!-- ... -->
</products>

ページ固有の XSL は処理命令 <?xml-stylesheet type="text/xsl" href="uri"?> で指定します (type="text/xsl" は必須です)。省略した場合はサーブレットパラメータで指定したデフォルトの XSL ファイルが適用されます。XSL ファイルに '/' から始まる URI を指定した場合はドキュメントルートからの相対パスと見なされます。

XML ファイルで使用できる機能は以下の通り。

名前空間

名前空間の指定は XML スキーマを認識する XML エディタを使用している場合に便利です。ドキュメント内には複数の名前空間を混在させる事が可能です。

XML 側で名前空間を使用する場合は XSL 側でも名前空間を意識した記述を行わなければならないので注意してください。

外部ファイルの挿入

XML 内では XInclude を使用して別のファイルの内容を取り込む事が出来ます。

<pre><xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
    href="sample.java" parse="text" /></pre>

href 属性にはリモートサイトの URL も指定できますが、内容の取り込みは XSL 変換が行われるタイミングのみであることに注意してください (変換結果はキャッシュされます)。

スキーマ検証

スキーマ検証を使用して非妥当なページをログで確認したり、例外を発生させてクライアントへの送信を阻止する事ができます。

DTD による検証は XML 文書内に宣言されたドキュメント型に基づいて行われます。

<!DOCTYPE html PUBLIC
  "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

XML Schema を使用した検証は XML Schema Instance の schemaLocation でスキーマの場所を指定します。

<products xmlns="http://www.foo.com/xmlns/products"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.foo.com/xmlns/products ../schema/products.xsd">

これらのスキーマ検証はサーブレットパラメータに指定する事で有効になります。

XSLファイルの作成

XSL ファイルは WEB-INF/ などのようにブラウザから直接アクセスできない場所に配置することができます。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
<xsl:output method="html" />
<xsl:template match="/products">
<html>
<body>
<p>製品カタログ</p>
<table>
<xsl:for-each select="product">
<tr>
    <td><xsl:value-of select="@id"/></td>
    <td><xsl:value-of select="@category"/></td>
    <td><xsl:value-of select="@name"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

前述の XML に上記の XSL を適用したレスポンスは以下のようになります。

<html>
<body>
<p>製品カタログ</p>
<table>
<tr>
<td>0001</td><td>Kitchen</td><td>Caffee Cup</td>
</tr>
<tr>
<td>0002</td><td>Kitchen</td><td>Sauser</td>
</tr>
<tr>
<td>0003</td><td>Kitchen</td><td>Fork</td>
</tr>
</table>
</body>
</html>

XSL で同一サイト内へのリンクを作成できるように、サーブレットからいくつかのパラメータが渡されます。例えばファイルの配置場所によらず全てのページで共通のロゴ画像を表示する場合は以下のように記述することが出来ます。

<img src="{$context-path}/img/logo.png" alt="Welcome to my site."/>

ページ設計のヒント

サイト設計

一般的なサイトでは XHML(コンテンツ) + XSL(テンプレート) + CSS(物理装飾) という分担で作成すると便利です。文章よりもデータベース的な特色が強いページでは専用のスキーマに XSL を作成した方が便利ですが、あまり自由で多種多様なスキーマを散在させると XSL ファイルやサイト全体のメンテナンシビリティが低下するためおすすめできません。

何種類かの XSL ファイルを作成しなければならない場合でも XSL の import や include をうまく使えば共通化を図る事が出来ます。

動的コンテンツの対応

このサーブレットは HTML ファイルのような静的コンテンツのテンプレート化を目的としていますので、JSP のようにリクエストごとに出力結果を変える設計には対応していません。この背景には XSL 処理の負荷が高く、リクエストごとに変換処理を行っていては十分なパフォーマンスが得られないという理由もあります。

動的な要素が必要なページには JSP を使用してください。またそれほどセンセーショナルな動的さでなければ Ajax も検討に値するでしょう。

Sun Java ダウンロードページ
SourceForge.JP
Valid XHTML 1.1