XSLTによる
文書の変換

XSLTとは

XML文書として記述された情報に基づいて、Webページを作成したいとします。 XML文書で表現されている構造はデータの性質に基づいた意味的な構造です。 HTMLで記述するような、Webページとしての構造とは異なります。 そこで、元のXML文書の構造に従いつつ、 Webページとしての構造を造り出すことが必要となります。

XSLT (XSL Transformations)は、XML文書を他の文書に変換するための言語です。 XML用のスタイルシート言語であるXSLの一部として設計されました。 一般のXML文書を書式の指定を持つ別のXML文書へ変換するのが本来の目的ですが、 汎用のXML変換用言語として使われています。

XSLTの能力は「変換」という言葉から想像するよりもずっと強力です。 XSLTで記述するのは、このパターンにマッチした場合はこういう出力にする、というルールです。 よって、元のXML文書の構造とはまったく異なる構造を持った新たなXML文書を生成することが可能です。

ここでは、独自のスキーマに基づくXML文書をHTML文書やXHTML文書に変換し、 Webブラウザで表示するための方法を紹介します。

XSLTによるXML文書変換の流れ

以下のXML文書に対してXSLTを適用した例を用いて、XSLTによるXML文書変換の流れを説明します。

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="booklist.xsl"?>

<!-- 以下の内容は参照されないので、XMLの文法に沿っていれば何でもよい -->
<booklist>
  <book>
    <title>オブジェクト指向のためのJava入門</title>
    <author>増田英孝</author>
  </book>
</booklist>

※2行目で、適用するスタイルシート booklist.xsl を指定しています。

XSLTによるXML文書の変換を行うには、XSLTで書かれた変換ルールを解釈し、 実際にXML文書の変換を行うプログラムが必要です。 このプログラムのことをXSLプロセッサと呼びます。 XSLプロセッサはXSLTによる変換ルールと変換元のXML文書を読み込み、 変換結果である新たなXML文書を出力します。

XSLプロセッサには、単体のプログラムとして動作するものと、 ライブラリとして他のプログラムから呼び出して使用するものがあります。 XSLTはサーバ側でのXML→HTML変換に使われることが多く、 この場合には単体のXSLプロセッサが使われますが、 今回はサーバサイドの処理は扱いませんので、 Webブラウザから呼び出すタイプのものを利用します。 Mozilla の 1.2 以降や Internet Explorer 6.0 にはXML用のライブラリ(XMLプロセッサ) が標準で組み込まれていますので、それを利用することにします。

XSLT入門

スタイルシートの基本構造

XSLTによるスタイルシートの基本構造を見ていきましょう。 次のスタイルシートは、どんなXML文書に適用しても、 以下の背景がピンクの部分のHTML文書に変換(?)してしまうものです。

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="html" encoding="utf-8"/>

  <xsl:template match="/">
     <html>
       <head>
         <title>はじめてのXSLT</title>
       </head>
       <body>
         <h1>はじめてのXSLT</h1>
         <p>そのうちここにXML文書の内容が反映されます。</p>
       </body>
     </html>
</xsl:template> </xsl:stylesheet>

では、上から順に見ていきましょう。

<?xml version="1.0" encoding="utf-8"?>

これはおなじみのXML宣言です。 XSLTによるスタイルシートもXML文書というわけです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  ......

</xsl:stylesheet>

次に、stylesheet要素があります。 XSLTのスタイルシートでは、stylesheet要素が文書のroot要素となります。 この例では、stylesheet要素のようにXSLTの仕様で定められている要素の前には「xsl:」 をつけることにしています。

stylesheet要素のversion属性は必須です。現在は1.0です。 xsl:stylesheet のかわりに xsl:transform としても全く同じです。

stylesheet要素内に様々なルールを要素として記述します。 stylesheet要素の子要素(トップレベル要素)の出現順序には意味がありません(xsl:import要素を除く)。

  <xsl:output method="html" encoding="utf-8"/>

これは、このスタイルシートの適用の結果生成される文書の種類を指定しています。通常は xml と指定するのですが、ここでは html と指定しています。html と指定すると、HTMLの仕様上、閉じタグのあってはいけない要素で閉じタグを自動で削除してくれます(今回のソースでは不要な処理です)。

  <xsl:template match="/">
     <html>
       <head>
         <title>はじめてのXSLT</title>
       </head>
       <body>
         <h1>はじめてのXSLT</h1>
         <p>そのうちここにXML文書の内容が反映されます。</p>
       </body>
     </html>
</xsl:template>

ここがスタイルシートの核となる部分です。 xsl:template は、match属性で指定したパターンにマッチしたときに使われるテンプレートです。 この場合、match="/"、つまり文書全体にマッチしたとき、 このテンプレートが適用され、背景がピンクの部分のHTML文書が出力されます。 XSL要素以外の要素(「xsl:」で始まらないタグ名の要素)は、そのまま結果の文書に出力されることになっています。

演習 上に示したサンプルを参考に、 埋め込まれたHTML文書を生成するXSLスタイルシートを作成してみましょう。 エディタ(TeraPad,Emacsなど)でXSLスタイルシートを作成したら、「〜.xsl」という名前で保存します。 変換の対象となるXML文書も必要で、その中で適用するスタイルシートを指定します。 ファイル名は「〜.xml」です。 Webブラウザで「〜.xml」を開き、 自動的にスタイルシート「〜.xsl」が読み込まれて変換が行われるか確認しましょう。

XHTML文書への変換 (参考)

前の例ではHTML文書に変換しましたが、今度はWebブラウザの理解できるXML文書であるXHTML文書に変換してみましょう。 ほとんど変わりはありません。

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" encoding="utf-8"
              doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
              doctype-system="DTD/xhtml1-strict.dtd" />

  <xsl:template match="/">
     <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
       <head>
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
         <title>はじめてのXSLT</title>
       </head>
       <body>
         <h1>はじめてのXSLT</h1>
         <p>そのうちここにXML文書の内容が反映されます。</p>
       </body>
     </html>
</xsl:template> </xsl:stylesheet>

XHTML文書はXML文書なので、xsl:output では method="xml" としています。 method="html" として特殊な処理をする必要はありません。

  <xsl:output method="xml" encoding="utf-8"
              doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
              doctype-system="DTD/xhtml1-strict.dtd" />

doctype-public とdoctype-system の2つの属性が追加されています。 これにより、以下の文書型宣言が生成されます。

  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
      "DTD/xhtml1-strict.dtd">

これがXHTML 1.0の文書型宣言です。 なお、「html」の部分は属性で指定していませんが、 ここには生成されるXML文書のroot要素名が自動的に入ります。