XSLTスタイルシートを迷わず記述する6つのポイント
Visual BasicやJava、C++などの言語に慣れた方にとっては、XSLT(Extensible Stylesheet Language Transformations)の構文は、極めて奇異に見えるのではないでしょうか。「<xsl:〜>といったタグがちりばめられたコードの、一体どこが『プログラミング言語』だというのだろう?」とさえ思っている人もいるかもしれません。
しかし、XSLTは条件分岐から繰り返し処理、パラメータ処理、外部ファイルのインポート機能などを多彩に備えたれっきとしたプログラミング言語です。XML文書を処理するAPIとしては、XSLT以外にもDOM(Document Object Model)などがあり、既存のプログラミング言語に慣れた方は好んでこちらを採用する傾向もあるようです。しかし、DOMによる処理に比べ、XSLTは変換処理が高速であることは意外と知られていない事実です。もちろん、DOMを使わなければできないことも多々あるのは事実ですが、XSLTで賄える点は極力XSLTで行うのが、パフォーマンス的な観点からも好ましいといえましょう。
それに、何よりもXSLTは「非常に分かりやすい言語」です。最初のとっかかりさえつかんでしまえば、そこから実践までのステップは極めて早いはずです。本稿では、その「とっかかり」の部分―XSLTを記述するうえでの基本となるべき6のポイントを挙げてみることにします。
<?xml version="1.0" encoding="Shift_JIS" ?> <?xml-stylesheet type="text/xsl" href="basic.xsl" ?> <books author="YAMADA Yoshihiro"> <title>2000年〜2003年主要書籍一覧</title> …中略… </books>
<?xml version="1.0" encoding="Shift_JIS" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <head> <title><xsl:value-of select="books/title" /></title> </head> <body> <h1><xsl:value-of select="books/title" /></h1> <hr /> <div align="right"> <xsl:value-of select="books/@author" /> </div> </body> </html> </xsl:template> </xsl:stylesheet>
(1)拡張子は「.xsl」
HTMLが「.html」、CSSが「.css」であったように、XSLTスタイルシートの拡張子は「.xsl」でなければなりません。
(2)ルート要素は<xsl:stylesheet>要素
XSLTではすべての要素が<xsl:stylesheet>要素の配下に記述されなければなりません。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> …中略… </xsl:stylesheet>
xmlns:xsl属性はXSLTスタイルシートの名前空間URI(XSLTの仕様、バージョンを特定するキー)を決定するもので、XSLT 1.0を使用する場合には固定値と考えておけばよいでしょう。version属性も2003年4月時点では“1.0”で固定です。今後“1.1”、“1.2”と、異なるバージョンが併存するようになったときには互換性を保つキーとなる重要な情報です。
(3)XSLTはテンプレートの固まり
<xsl:template>要素は、XML文書の変換に際して適用される一連の変換ルールを定義した、文字どおり「テンプレート」です。XSLTスタイルシートは、この「テンプレート」の集合体として構成されます。
<xsl:stylesheet>(ルート)要素配下には、必ず1つ以上の<xsl:template>要素が存在しなければなりません。
(4)エントリポイントは「/」
その複数のテンプレートの中から、XSLTスタイルシートを実行する基点(エントリポイント)となるのが、
<xsl:template match="/"> …中略… </xsl:template>
で定義されるテンプレートです。
match属性はテンプレートを適用する要素を指定しますが、「/」と指定した場合、文書全体を表します。XSLTスタイルシートは必ずこのエントリポイントを含むテンプレートを持たなければなりません。
(5)要素、属性の値を出力する
テンプレートの中で、具体的に要素や属性の値を取得し、出力する役割を担うのは<xsl:value-of>要素の役割です。
<xsl:value-of select="books/title" /> <xsl:value-of select="books/@author" />
select属性は取得する要素、属性へのパスを指定します。XML文書はあたかもディレクトリのような階層構造で表されますが、XSLTではまさにこの階層構造をたどっていくに際して、パスを指定するのとまったく同等のイメージで行います。また、いわゆるカレントディレクトリならぬカレントノードの概念もあるのに注目してください。
この場合、ベースとなるテンプレートが「/」を基点としていますので、これがカレントノードとなり、「/」からの相対的な階層構造をselect属性で表す必要があります。つまり、以下の図のようになります。
つまり、カレントノードがもしも<books>要素であれば、select属性の指定値はそれぞれ「title」「@author」でよいことになります。属性名を指定する場合には頭に「@」を付加する点に注意してください。
(6)XSLTもまたXML文書である
「XSLTスタイルシートもまたXML文書です」、あるいは「XSLTスタイルシートもまたXMLの構文規則に従っていなければなりません」。意外と意識から抜け落ちがちなこのポイントが、しかし、XSLTを記述するうえで一番間違いやすく、また重要な注意点でもあります。例えば、サンプル12行目に、
<hr />
という記述がありますが、これを「<hr>」としたら不可です。なぜなら、閉じタグがない場合、XML文書では開始タグを「〜/>」でクローズしなければならないからです。出力するHTMLタグであっても、あくまでXSLTの一部ですから、この規則の例外ではないのです。
最後に、いま一度XML文書の記述規則を挙げてみることにしましょう。
- XML文書であることを宣言すること(<?xml?>処理命令)
- 唯一のルート要素を持つこと(<xsl:stylesheet>要素)
- 終了タグは省略しないこと。省略する場合は開始タグを「〜/>」で閉じること
- 要素は正しくネスト(入れ子)構造になっていること(<b><i>...</b></i>は不可)
- 属性値は必ず引用符(「"」「'」)で囲むこと
- 属性値の省略形は使用しないこと(「<option selected />」は「<option selected="selected" />」)
Copyright © ITmedia, Inc. All Rights Reserved.