このページの本文へ

XSLTを書いてみよう(1)

XMLの常識

2000年07月20日 19時41分更新

文● 及川晴生

  • この記事をはてなブックマークに追加
  • 本文印刷

 前回は、XSLTを使ってXMLを別のスキーマのXML、あるいはHTMLなどに変換できると書いたが、ではXSLTとは具体的にどういった規格なのか、今回はこのあたりを突っ込んで解説したい。

 XSLTはXMLの規格と同じく、非営利団体であるW3Cによって勧告されている。仕様は完全にオープンで、開発者はその仕様に従って、自由にアプリケーションに実装することができる。これらXSLT対応アプリケーションは、XMLとXSLTファイルを読み込み、XSLTファイルに記述されたルール(テンプレート)に従ってXMLを変換し、その結果を出力するというのが、基本的な動作になる。

XSLTの特徴

 XSLTの第一の特徴は、構文自体がXMLの規格に則ったものになっているという点。つまり、変換のルールは、タグを記述することによって指示していくわけだ。XSLTの仕様には、変換を行なうために利用するタグがいくつも定められており、これらのタグを使い分けることによって、XSLTプロセッサにどのように変換をするかを指示していく。

 XSLTの第2の特長は、XSLTの特徴はプログラミング言語的な側面も持っている点である。タグの中には、条件分岐を行なうもの、あるいは変数や引数を利用するためのものなどがあり、これらを利用することにより、単純にタグの名前を変換するといったことだけでなく、エレメントの値によって結果を変更する、あるいは引数によって処理を変えるといったことが行なえる。HTMLに変換する場合なら、「価格エレメントの値が1000以上ならば赤字で表示し、それ以下なら黒字にする」といった変換も可能である。

 XSLTは、「XPath」という規格も同時に利用する。XPathがXSLTに対して提供する機能はいくつかあるが、特に重要なのがXSLTによる処理を行なう範囲の指定である。たとえばエレメントの値を取り出す場合、どのタグに挟まれているのかを、何らかの方法で指示しなければ取り出せないわけだが、このタグを指定する記述の仕方をXPathで定めているわけだ。たとえば「住所録タグの下にある名前タグ」を指定するといった場合ならば「住所録/名前」といったようにパスを指定する。これをXSLTでは<xsl:value-of select="住所録/名前"/>と記述する。これによって、住所エレメントの下にある名前エレメントの値が得られるわけだが、この"住所録/名前"という部分がXPathの規格を使っている部分になる。

 また、XPathはXSLTに対して関数の機能も提供している。関数は大きく分けて「ノード集合関数」「文字列関数」「ブール関数」「数値関数」に分けられ、2つの文字列の接続や、文字列から指定した長さを取り出すといったことも関数を利用すればできる。前回、XSLTを利用すれば、エレメントとしてXML文書に記述されているものを属性に変換することもできると書いたが、こうした単純な変換ではXPathの関数まで覚える必要はない。しかし、同じ名前のタグでも現われた順番によって処理を変える、エレメントの値の一部分だけの値を調べるといったことを行なおうとすると、XPathの関数が必要になってくる。

XSLTの基本

 上記のような機能をフルに活用すれば、かなり高度な変換まで実現できる。ただ難点となってくるのが、高機能ゆえの難しさである。例1は、<doc>というタグを<文書>タグに変換するためのごくごくシンプルなXSLTだが、これだけを行なう場合でも、XSLTによる変換のプロセスや理屈が理解できていなければ書くのは難しい。ただそれらさえわかってしまえば、それなりにXSLTを記述できるようになる。ここではこのXSLTの基本的な部分を、じっくり解説したい。

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="doc">
<文書>
<xsl:apply-templates/>
</文書>
</xsl:template>
</xsl:stylesheet>

例1

 まず1行目はXML宣言文で、先に解説したとおりXSLTもXMLになっているので、XMLに必須のXML宣言を記述しなければならない。2行目には<xsl:stylesheet>というタグが記述されている。これはXSLT全体を括るためのタグで、必ず必要となるもの。属性としてまず「version」を記述しているが、これはXSLTのバージョンを指定するもので、現時点では「1.0」という値を記述する。このversion属性は必須となっているので、必ず書かなければならない。

 続いて「xmlns:xsl="http://www.w3.org/1999/XSL/Transform"」という文字があるが、これはXMLの関連規格の1つである「ネームスペース(正しくはNameSpaces in XML)」の設定を行なっている部分である。ネームスペースはXMLの中でも重要な規格なので回を改めて解説するが、1つのXML文書中に複数のスキーマ(タグや属性の名前、文書の構造などの規定)を混在させるために用意された規格だ。たとえば、HTMLの中に化学式を含めたい場合、すでに化学式のスキーマが用意されているのなら、HTMLの規格の中に化学式のタグを追加するのではなく、すでに規格化されている化学式のタグを利用するほうが効率的だろう。このように1つの文書の中に複数のスキーマを混在させる場合、何らかの方法でタグを区別する方法を用意する必要がある。なぜなら、もし2つのスキーマで同じ名前のタグがあった場合、処理を行なうソフトウェアはどちらのスキーマのタグかを判断する手段がないからだ。そこで、インターネット上で一意のデータであるURIを利用し、スキーマの区別を行なうというのがネームスペースである。

 ただURIとして「http://www.ascii.co.jp/」などを利用すると、タグを書くたびにその長い文字列を打ちこまなければならず面倒くさい。そこで簡単な文字を用意し、その文字とURIを関連付けておいて、その簡単な文字が現われればそのURIであることにすれば、いちいち長いURIを書く暇が省ける。その関連付け作業が「xmlns:xsl="http://www.w3.org/1999/XSL/Transform」という部分である。この設定を行なうには、「xmlns:」という文字に続けて、先ほど述べた簡単な文字(プリフィックスという)を記述する。XSLTであれば「xsl」という文字を使うのが一般的である。続けて「=」を書き、そのプリフィックスに関連付けるURIとして、XSLTの規格で指定されている「http://www.w3.org/1999/XSL/Transform」というURIを「"」で括って記述する。これで「xsl」という文字が現われると「http://www.w3.org/1999/XSL/Transform」というURIとして解釈する。これによってXSLTを処理するソフトウェアは、XSLTとそれ以外のタグを見分けることができるわけだ。これからXSLTのように数多くのXMLのスキーマが登場すると思われるが、基本的にはそれぞれのスキーマごとにこうしたネームスペースを設定することになる。

 最初の<xsl:stylesheet>エレメントに関しては、大雑把に説明するとこんな感じになる。ただこの辺りのことを理解しなくても、XSLTの記述であれば「<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"gt;」と記述すればよい、と覚えておけば間違いない。次回は、これ以降のタグを解説していく。

カテゴリートップへ

アスキー・ビジネスセレクション

ASCII.jp ビジネスヘッドライン

ピックアップ