はじめに
この記事では、汎用のXMLトランスフォーマ/バリデータであるXmlTransformについて解説します。XmlTransformは、変換対象のファイルがどのような深さのディレクトリツリーに格納されていても問題なく機能します。出力時には複数レベルの索引を生成でき、必要に応じてナビゲーションリンクを追加することも可能です。
XmlTransformの検証機能はかなりシンプルにできていて、変換に使用したXMLファイル一式が妥当かどうかを指定のXMLスキーマに従って検証します。入力ファイルと(変換後の)出力ファイルの両方、あるいはどちらか一方を検証するよう選択できます。
より興味深いのは変換機能の方です。変換エンジンはよくプリプロセッサとして使用され、Webページを制作するときに大いに役立ちます。
プリプロセッサとHTML
最新の技法を取り入れた整形式のHTMLは、XMLの名前を真似てXHTMLと呼ばれます。XHTMLには普通のHTMLと比べて、わずかですが重要な違いがあります。XmlTransformを使用すると、XMLファイルをきわめて効率よくWebページに変換できます。XmlTransformでは、実際には任意のXML出力を生成できるのですが、HTMLなど、読者の皆さんが既に知っているであろう具体的なファイル形式を扱った方がプロセスを想像しやすいと思うので、今回の説明ではHTMLの生成に焦点を絞ることにします。
ところでプリプロセッサとは何でしょうか。また、なぜこれが便利なのでしょうか。どのソフトウェアプロジェクトにおいても言えることですが、メンテナンスには大量のリソースが必要とされ、プロジェクト初期の設計やその後の実装よりも多くのリソースが費やされることもよくあります。プリプロセッサは、このメンテナンスコストの削減に役立ちます。
たとえば、ある会社のWebサイトを保守しているとします。このサイトは509もの単純なHTMLページから構成されていて、そのそれぞれに一定のサイズのロゴが表示されています。この会社が突然、サイトの見栄え、つまりページヘッダや書体、さらにはロゴのサイズを変更しようと決めた場合、新しいロゴの画像を表示するために500以上のページを1つひとつ編集しなくてはなりません。こういった変更に必要な作業量はページの設計方法に左右されるのですが、ここで重要なのは、この変更作業では、頻繁に登場するWebページ要素に対して同じ変更を繰り返しているということです。
そこでプリプロセッサの出番です。この考え方はスタイルシートに似ています。スタイルシートでは、あらかじめ定義しておいたスタイルを何度でも利用できます。それと同様に、プリプロセッサでは、スタイルに限らずWebページのあらゆるものに対して同じ処理を実行できます。たとえば、XML内で独自の<footer>
要素を作成しておき、そのXMLソースからページを生成するときに、<footer>
要素のマーカーを以下のXHTMLコード(コメントを含む)に自動的に置き換えることができます。
<!-- BEGIN footer --> <div> <div style="float:left"> <img src="image/logo.gif" alt="XYZ logo" width="143" height="25"/> </div> <div style="float:right"> XYZ Corporation -- (c) 2008 All rights reserved </div> </div> <!-- END footer -->
この置換処理は重要です。ソースファイル内の<footer>
要素のインスタンスを、ターゲットXHTMLファイル内で上記のコードに展開するためには、展開方法を正確に指定するXSLTを用いて、ソースの「変換」を行う必要があります。上記のHTMLを出力するXSLTコードは以下のようになります。
<xsl:template name="footer"> <xsl:comment>BEGIN footer</xsl:comment> <div> <div style="float:left"> <img src="image/logo.gif" alt="XYZ logo" width="143" height="25" /> </div> <div style="float:right">XYZ Corporation -- © 2008 All rights reserved</div> </div> <xsl:comment>END footer</xsl:comment> </xsl:template>
今回はこの記事のダウンロードサンプルに収録されているXSLTファイルを利用しますが、XmlTransformをうまく利用するにはXSLTの理解が不可欠です。作業の大半は、変換をコントロールするXSLTコードの作成に費やされます。簡潔で便利なXSLTを作成するにはかなりの努力が必要ですが、うまくできれば長い間利用できます。
XmlTransformの設定では、ソースファイルの共通の要素をすべてカプセル化するXMLダイアレクトを独自に定義します。また、その後にXSLTマッピングファイルを作成し、特定のダイアレクトをXHTML(あるいは変換後の任意のXMLダイアレクト)にどのように対応付けるかを指定する必要があります。この初期設定にはある程度時間が必要ですが、一度設定してしまえば、ロゴの変更(あるいは著作権表記などサイト全体を通じて使用される要素の変更)が、XSLTファイル内の1ヶ所を書き換えて出力ファイルを生成し直すだけで簡単に行えるようになります。
XmlTransformの動作を図1に示します。この図に説明をたくさん詰め込みましたが、1つひとつ分けて考えれば理解しやすいはずです。
ここでの目的は変換元のツリー(左上)を変換後のツリー(右下)に対応付けることです。「Schema validator」と「XSLT engine」という3つの黄色い長方形に注目してください。これらはアクティブなコンポーネントで、パスごとのオンとオフを、ブール型のコマンドラインスイッチオプション(図中では丸いスイッチで表現)で切り替えることによって制御します。この切り替えには、xslTransform
、validateInputToSchema
、およびvalidateOutputToSchema
のオプションを使用します。図1にはすべてのオプションが点線で囲んで表示されています。inExtension
やoutExtension
を使えば、変換元と変換先のファイルに異なる拡張子を指定できます。
たとえば、XMLをHTMLに変換する場合は、inExtension
に.xmlを指定し、outExtension
に.htmlを指定します。最後に、変換元のツリーの場所(sourcePath)と変換を実行するディレクトリのリスト(dirList)、そしてファイルの出力場所(targetPath)を指定する必要があります。図1では、dirList
に指定された変換元ツリー内のディレクトリが赤い長方形で囲まれています。それ以外のディレクトリは変換が行われないので、変換先ツリー内で×印が付いています。他にも考慮すべきパラメータが多数ありますが、そのほとんどはデフォルト値をそのまま使用できます。
上記以外にも、XmlTransformにはメンテナンスを簡単にする強力な機能が2つあります。それは、サマリ(目次)ページの作成と、ナビゲーションリンクの追加です。以降ではこの2つについて解説します。