前回までXML文書を別のXML、あるいはHTMLなどに変換するための規格「XSLT」の概要および実際のXSLT文書の作成を解説した。しかし当然ながら、XSLT文書を作成するだけではXML文書を変換することはできない。変換元となるXMLと変換ルールを記述したXSLTを読みこみ、XSLTの内容に従ってXMLを変換するソフトウェアが必要になる。
XSLTを使った変換を実現するソフトウェアは、選択肢が豊富とまではいえないがいくつかのソフトウェアは用意されている。マイクロソフトの「Internet Explorer」が、バージョン5からXSLTによる変換に対応しているほか、XSLT規格の編者であるJames Clark氏が作成した「XT」、apache.orgで公開されている「Xalan」などが有名なところ。上記はいずれも無償で提供されているが、インフォテリアの「iXSLT」など、有償で提供されている製品もある。この中でもっとも身近なInternet Explorerを使って、実際にXMLを変換させてみたい。
Internet Explorerを使ってXMLをXSLTで変換するには、XMLファイル側に「処理命令(Processing Instruction)」を記述する必要がある。処理命令とは、XMLを読み込んだソフトウェアに対して何らかの処理を行なわせたいときに用いるもの。Internet ExplorerにXSLTを適用してXMLを変換させたい場合は、以下の文をXML宣言(<?xml version="1.0"?>)のうしろに記述する。
<?xml-stylesheet type="text/xsl" href="{XSLTファイルへのパス}"?>
この処理命令の場合、「type属性で示された種類の、href属性の値のパスにあるファイルのスタイルシートを適用せよ」という意味になる。Internet Explorerはこの文を見つけると、href属性の値として記述されたXSLTファイルを読み込み、それを使ってXMLを変換して画面上に表示する。
余談だが、ここではXSLTで変換を行なわせるため、type属性の値として「text/xsl」を指定しているが、これを「text/css」にしてhref属性にCSSが記述されたテキストファイルのパスを記述すると、CSSでフォーマットされた結果が表示される。もちろんXSLTを使って変換したHTMLにCSSを記述することもできるので、現時点ではそれほど意味をなさない。ただ将来的にCSSが強力になれば、XSLTを使わずCSSでスタイル付けを行なうといったことも十分考えられる。
では、実際に変換を行なってみよう。以下のXMLとXSLTをエディタなどに貼り付け、ファイルとして同じディレクトリに保存してほしい。その後、変換元のXMLファイルをInternet Explorer 5以上で開けば、HTMLに変換されて表示されるはずだ。
<?xml version="1.0" encoding="shift_jis"?> <?xml-stylesheet type="text/xsl" href="style.xsl"?> <document> <title>XSLTについて</title> <para>本文</para> </document>
変換元XML
<?xml version="1.0" encoding="shift_jis"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="document"> <html> <head> <title>XML変換のテスト</title> </head> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="title"> <h1><xsl:apply-templates/></h1> </xsl:template> <xsl:template match="para"> <p><xsl:apply-templates/></p> </xsl:template> <xsl:template match="text()"> <xsl:value-of select="."/> </xsl:template> </xsl:stylesheet>
XSLT
前回、XSLTの記述方法について説明しているので、このサンプルの内容は詳しく解説しないが、基本的には変換元XMLの<title>タグで括られたテキストを<h1>で、<para>タグのテキストを<p>で括ってHTMLとして出力している。
ただ、前回説明した部分とは異なっている部分もある。まず1つは、<xsl:stylesheet>エレメントでネームスペースを設定している部分で、第2回目にサンプルとして掲載したXSLTはネームスペースのURIとして「http://www.w3.org/1999/XSL/Transform」を記述した。しかし今回のXSLTは「http://www.w3.org/TR/WD-xsl」としている。これはInternet ExplorerのXSLTが、勧告される前のワーキングドラフトの状態で実装されており、ワーキングドラフトで定められたURIしか認識しないため。Internet Explorerに、XSLTのネームスペースとして「http://www.w3.org/1999/XSL/Transform」のURIを記述したXSLTを読み込ませてもこのURIの意味を知らないため、それがXSLTであると認識されない。
もう1つ注意したいのが、<xsl:template match="text()">から始まるテンプレートの部分で、match属性の値として「text()」と記述している。これはテキストノードを表わしており、つまりこの部分はテキストノードに適用されるテンプレートであることを示している。ただ、XSLTの正式勧告では前回説明した「組み込みテンプレートルール」というものがあり、テキストノードは自動的にそのテキストが結果として出力される。そのため勧告に対応したソフトウェアを利用する場合はこの部分を書く必要はないのだが、組み込みテンプレートルールがないInternet Explorerでは、これを記述しないとテキストが出力されない。なおこのテンプレートの中で<xsl:value-of select="."/>というタグがあるが、これはselect属性で指定されたノードをテキストとして結果に出力してくれる。ここではノードとして現在選択されているノードを表わす「.」を記述し、カレントのテキストを出力している。
これ以外にも、勧告となったXSLTには<xsl:sort>というデータをソートするためのエレメントが用意されているのだが、Internet Explorerではこれがサポートされていない(別の方法でソートする)など、勧告とは異なっている部分がいくつかある。現在もっとも手軽に利用できるXSLTプロセッサであるだけに、勧告への完全対応をいち早く望みたいところである。