今回のテーマは、XMLデータの構造変換のための技術であるXSLTだ。XSLTは、データベースの入出力や電子商取引のデータ交換などさまざまな場面での利用が期待されている。今回から、初学者がつまずきやすい点を含めながら、XSLTの基本を数回にわたって解説する。
XSLT(eXtensible Stylesheet Language Transformations)は、XMLデータ(注)の構造変換ルールを記述するための言語だ。XSLTは元をただせば、XMLデータの表示・印刷のためのスタイル指定言語XSL(eXtensible Stylesheet Language)の一部だった。しかし、XSLTの用途は表示・印刷にとどまらない柔軟なものだったため、現在ではXSLからは独立した仕様となっている。XSLTを一言でいうならば、あるXMLデータを、別の形式のXMLデータにもHTMLデータにもテキストデータにも変換できる汎用的なツールだ。
XMLデータは、ツリーとしてモデル化できる。また、要素などXMLデータを構成する各パーツは、ツリーを構成するノード(node:節点)としてモデル化できる。XSLTは、与えられたXMLのツリーと、XSLTで表現された変換ルールを照らし合わせて、別の構造のXMLツリーを生成する。ここで、元のXMLツリーのことをソースツリー(source tree)、新たに生成されるXMLツリーを結果ツリー(result tree)と呼ぶ。また、XSLTによる変換ルールを記述したXMLデータをスタイルシート(stylesheet)と呼ぶ。このような構造変換を行うソフトウェアのことをXSLTプロセッサ(XSLT processor)と呼ぶ(図1)。
XMLデータを変換する簡単な例を使って、スタイルシートの仕組みを示そう。リスト1に示すXML形式の仕入先情報を、変換元のXMLデータとして用いる。
<?xml version="1.0" encoding="shift_jis"?> |
リスト1 仕入先情報 |
これを、リスト2に示すHTML形式に構造変換して、Webブラウザで表示できるようにしたい。
<html> |
リスト2 Webブラウザ表示のためにHTML化した仕入先情報 |
この構造変換のために記述したスタイルシートをリスト3に示す。
|
||||||
リスト3 仕入先情報をHTML化するためのスタイルシート (注)結果ツリーにスペースやタブによるインデントを残すためには、スタイルシートに空白制御のための命令を記述すべきところだが、ここでは省略している。 |
リスト3のスタイルシートは、以下のパーツから構成されている。
(1)XML宣言
XSLT自体はXML文法に従う記法で記述する。従って、スタイルシートの冒頭にXML宣言を書く。
(2)スタイルシートの本体
スタイルシートは、XSLTの名前空間に属する要素を使って記述する。スタイルシートの最上位要素xsl:stylesheet要素は、XSLTのバージョンやXSLT名前空間を宣言する。リスト3ではXSLTの名前空間接頭辞として「xsl」という文字列を使用している。もちろん、ほかの文字列でも構わないが、「xsl」という文字列が一般に使われている。
(3)出力指定
xsl:output要素は、結果ツリーをファイルへ出力する際の出力形式を指定するXSLT要素だ。
(4)と(5)テンプレート規則
ソースツリーのどこを変換するか、どのような構造に変換するのか、という変換ルールを、テンプレート規則(template rule)と呼ぶ。テンプレート規則はxsl:template要素によって記述する。
テンプレート規則を表現するxsl:template要素は、スタイルシートの要(かなめ)だ。そこで、xsl:template要素についてはもう少し詳しく解説しよう。
XSLTによる構造変換は、下記のような形で行われる。
●ソースツリー中の変換したいノードごとにテンプレート規則を用意することで表現する
●あるテンプレート規則をどのノードに適用するかは、xsl:template要素のmatch属性で指定する
●XSLTプロセッサは、最上位のノードからスタートしてソースツリーを解析していく
●あるxsl:template要素のmatch属性が指定している特定の要素や属性の出現の仕方(これをパターン(pattern)と呼ぶ)を見つける
●そのxsl:template要素が記述しているテンプレート規則を適用して変換処理を行う
パターンは、次回で詳しく解説するXPath(XML Path Language)と呼ぶ記述言語で表現する。
以上の点を、リスト3のスタイルシートを使って説明しよう。まず、(4)テンプレート規則のxsl:template要素の一部を見ていただきたい。
(4)テンプレート規則 |
…… ルートノードを起点にする |
match属性に「/」という文字が指定されている。XPathでは、XMLツリーの最上位ノードをルートノード(root node)と呼び、「/」で表現する。ルートノードについては後で詳しく述べるが、これは最上位の要素(リスト1でいうとsupplier要素)の親として存在する特別なノードだ。
XSLTプロセッサは、ルートノードを起点にして処理を始める。従って、リスト3のスタイルシートを処理するXSLTプロセッサは、ソースツリーの変換処理を(4)のxsl:template要素のテンプレート規則から始めることが分かる。
xsl:template要素の「要素の内容」(開始タグと終了タグで囲まれた内容データ)のところに、変換後の構造を記述する。これは、テンプレート(template)と呼ばれる。テンプレートには結果ツリーに加えたい要素や属性のタグをそのまま埋め込むことができる。(4)のxsl:template要素のテンプレートを見ると、結果ツリーに加えたいHTML要素であるhtmlタグがそのまま埋め込まれている。
(4)テンプレート規則 <html> </xsl:template> |
|
xsl:template要素の属性が“match="/"”とされているため、このテンプレート規則は、ルートノードを起点にして処理を始める。要素の内容となるテンプレートには、結果ツリーに加えたい<html>タグなどをそのまま埋め込むことができる |
変換の仕方を指示するXSLT要素を、命令(instruction)と呼ぶ。テンプレートには結果ツリー生成に必要なXSLT命令も書き込むことができる。(4)のテンプレートに出現しているxsl:apply-templates要素もXSLT命令の1つだ。
(4)テンプレート規則 |
|
xsl:apply-templates要素は、XSLT命令の1つ。この命令が出現すると、現在のテンプレートで処理しているノードの子ノードを処理するためのテンプレート規則へ処理を移す。リスト3では、(5)のテンプレート規則がそれに当たる |
xsl:apply-templates要素は、別のテンプレート規則の適用を指示するXSLT命令だ。XSLTプロセッサはxsl:apply-templates要素を見つけると、現在処理中のノード(これをカレントノード(current node)と呼ぶ)の、さらに子ノードを処理するテンプレート規則へ処理を移す。この移動は関数呼び出しに似ている。オプションのselect属性を付けてカレントノードの子ノード以外のノードへ処理を移すことも可能だ。
(4)のテンプレート規則のカレントノードは、match属性で指定されているルートノード(すでに述べたとおり、「/」はルートノードを表す)だ。従って、XSLTプロセッサは、(4)のxsl:apply-templates要素にしたがって、ルートノードの子ノードであるsupplier要素のテンプレート規則を探す。supplier要素のテンプレート規則を定義しているのは(5)のxsl:template要素だ。XSLTプロセッサは、(5)のxsl:template要素に記述された処理を行うことになる。
(4)テンプレート規則 (5)テンプレート規則
|
|
(4)テンプレート規則の途中で、子ノードを処理するテンプレート規則へ移動するXSLT命令が出現したため、処理は(5)テンプレート規則へ移動する |
(5)のxsl:template要素には別のXSLT命令が記述されている。h1タグに挟まれたxsl:valu-of要素だ。xsl:value-of要素は、select属性で指定した要素や属性の文字列値(取りあえず、要素の内容や属性値と理解していただきたい)を出力するためのXSLT命令だ。
xsl:value-of要素のselect属性で指定されている「.」は、カレントノード(この場合はsupplier要素)のことを意味している。従って、以下のXSLT命令によって、カレントノードであるsupplier要素の内容データが、h1要素の内容データとしてコピーされることになる。
(5)テンプレート規則 |
結果として、(5)のxsl:template要素では、以下のツリーが生成される。
<h1>ユニテック商事(株)</h1> |
(5)で生成されたh1要素以下のツリーは、呼び出し元である(4)のxsl:apply-templatesの位置に組み込まれる。最終結果として、リスト2に示す最終的な結果ツリーが完成する。
<html> |
リスト2(再掲) Webブラウザ表示のためにHTML化した仕入先情報 |
今回は、XSLTの基本的な仕組みについて説明してきた。次回はXMLツリーの中で、特定のノードを正確に特定するための記述言語XPathを解説する。XPathはさまざまな場面で使われるが、XSLTを理解するのにXPathの知識は必須だ。
Copyright © ITmedia, Inc. All Rights Reserved.