XML 輪講資料 (2003/11/18)

西田 担当分

実例研究 -XML 日記-

前提知識

Diary Language の模索

HTML は自分の日記を管理するデータ形式として適していないという思いから、 XML を試すことにした。 XML を採用した最大の理由は、もし XML より優れたものが使われるようになったとしても、 XML からなら比較的容易に移行できると思われることだ。 Diary Language を作る必要は必ずしもなかった (XHTML でも先の条件は満たす) が、 かねてから HTML の定義にも不満があったので、挑戦することにした。

考慮した主な事項

結果行き着いたもの

<document>
  <info>(作者などのメタ情報)</info>
  <body>
    <overview> (月に一度書くこと) </overview>
    <diary>
      <section> (章題や本文) </section>
      …
      <section> (章題や本文) </section>
    </diary>
    …
    <diary>
      ****
    </diary>
  </body>
</document>

修正すべき点は多いが、今回はあえてこのままで話をすすめる。

DTD を書いた

前章を踏まえて diary.dtd を書いた。

XSLT も書いた

基本

ブラウザで表示することが目標なので変換先は HTML である (色などの指定には CSS を用いる)。 XSLT の基本は「この要素はこう置き換える」という template を書くことである。 XSLT 処理系は、 XML document の木を depth-first にたどりながら、 マッチしたテンプレートを適用していく。 例えば、element1 を element 2 に置き換えたいときは、以下のように書くことになる。

<xsl:template match="element1">
  <element2>
    <xsl:apply-templates /> <!-- 子ノードの処理 (ここで子ノードを辿る、の意) -->
  </element2>
</xsl:template>

少しだけ応用

実際には、木の構造を変化させるような変換など、 単純な置き換えでは実現できないことも多い。 今回の変換では、/document/info の内容をヘッダーやフッターなど 複数の場所で表示するために、木の構造を変更しなければならなかった。

いろいろ試した結果、単純な置き換えではうまくいかない箇所は、 ひとつ親のレベルで処理するように書くしかないようである。 例えば、/document/info の内容を複数箇所に表示するためには、 その親ノードである /document の template としてその処理を書くことになる。

注意が必要なのは、apply-templates と書くたびに子ノードをすべて DFS するため、 二箇所に子ノードを書くからといって二回 apply-templates を書くと、 不必要な二重処理が発生することがあることである (apply-templates の match, select などの属性を指定するとよい)。

XML 日記当初 (2003/4) のもの

template を最上位ノードでしか使っていない。

XML 輪講にあたって書き直したもの

なるべく template を使うように書き換えた (xsl:apply-template を 4 回書くと、全体を 4 回 DFS する ?)。 他には、元文書の要素につけられた id を変換先にも含めるなどした。

補足

XSLT を書いてみた経験から、 (e1, e2+) のように子をもつ要素は XSLT で扱いにくいので (e1, e3) と e3 = (e2+) に分けるとよいという XML での言語設計に対する知見が得られた。

各ブラウザの対応状況

Internet Explorer

XML 文書に指定されている XSLT ファイルを適用して、変換結果を表示することができる (version 5.5 から?)。これを以下 XSLT 対応とよぶ。 XSLT ファイルにバグがあった場合は、エラー情報 (原因・行数) が報告される。

「ソースの表示」で表示されるのは元文書である。変換結果のソースを見る場合は、 以下にあげるソフトウェアをインストールする必要がある。

また、 DTD による検証を行うには別途ソフトウェアをインストールする必要がある。 well-formed であれば表示は行う。

Netscape

Netscape6 で XML 対応。Netscape7 で XSLT 対応。

Mozilla

最新版は XSLT 対応。well-formed なら表示は行う。

関連資料

XML はどのように使われようとしているか

Microsoft 社製の XML 関連ソフトウェア

XML 文書を XSLT で変換して表示するときに便利なソフトウェアを探したところ、 Microsoft 社製のものが一番、インストール、使い方ともに簡単だった。 XML General Downloads からダウンロードできます。