XML文書の構造を変えるXSLT:技術者のためのXML再入門(7)
今回のテーマは、XMLデータの構造変換のための技術であるXSLTだ。XSLTは、データベースの入出力や電子商取引のデータ交換などさまざまな場面での利用が期待されている。今回から、初学者がつまずきやすい点を含めながら、XSLTの基本を数回にわたって解説する。
XMLデータの構造変換
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データとして用いる。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
これを、リスト2に示すHTML形式に構造変換して、Webブラウザで表示できるようにしたい。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
この構造変換のために記述したスタイルシートをリスト3に示す。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
リスト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要素の一部を見ていただきたい。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
match属性に「/」という文字が指定されている。XPathでは、XMLツリーの最上位ノードをルートノード(root node)と呼び、「/」で表現する。ルートノードについては後で詳しく述べるが、これは最上位の要素(リスト1でいうとsupplier要素)の親として存在する特別なノードだ。
XSLTプロセッサは、ルートノードを起点にして処理を始める。従って、リスト3のスタイルシートを処理するXSLTプロセッサは、ソースツリーの変換処理を(4)のxsl:template要素のテンプレート規則から始めることが分かる。
xsl:template要素の「要素の内容」(開始タグと終了タグで囲まれた内容データ)のところに、変換後の構造を記述する。これは、テンプレート(template)と呼ばれる。テンプレートには結果ツリーに加えたい要素や属性のタグをそのまま埋め込むことができる。(4)のxsl:template要素のテンプレートを見ると、結果ツリーに加えたいHTML要素であるhtmlタグがそのまま埋め込まれている。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
変換の仕方を指示するXSLT要素を、命令(instruction)と呼ぶ。テンプレートには結果ツリー生成に必要なXSLT命令も書き込むことができる。(4)のテンプレートに出現しているxsl:apply-templates要素もXSLT命令の1つだ。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
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要素に記述された処理を行うことになる。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
(5)のxsl:template要素には別のXSLT命令が記述されている。h1タグに挟まれたxsl:valu-of要素だ。xsl:value-of要素は、select属性で指定した要素や属性の文字列値(取りあえず、要素の内容や属性値と理解していただきたい)を出力するためのXSLT命令だ。
xsl:value-of要素のselect属性で指定されている「.」は、カレントノード(この場合はsupplier要素)のことを意味している。従って、以下のXSLT命令によって、カレントノードであるsupplier要素の内容データが、h1要素の内容データとしてコピーされることになる。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
結果として、(5)のxsl:template要素では、以下のツリーが生成される。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
(5)で生成されたh1要素以下のツリーは、呼び出し元である(4)のxsl:apply-templatesの位置に組み込まれる。最終結果として、リスト2に示す最終的な結果ツリーが完成する。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
次回で扱う内容
今回は、XSLTの基本的な仕組みについて説明してきた。次回はXMLツリーの中で、特定のノードを正確に特定するための記述言語XPathを解説する。XPathはさまざまな場面で使われるが、XSLTを理解するのにXPathの知識は必須だ。
Copyright © ITmedia, Inc. All Rights Reserved.