連載
» 2002年05月29日 00時00分 公開

技術者のためのXML再入門(7):XML文書の構造を変えるXSLT

今回のテーマは、XMLデータの構造変換のための技術であるXSLTだ。XSLTは、データベースの入出力や電子商取引のデータ交換などさまざまな場面での利用が期待されている。今回から、初学者がつまずきやすい点を含めながら、XSLTの基本を数回にわたって解説する。

[吉田稔, 青木秀起,日本ユニテック]

XMLデータの構造変換

 XSLT(eXtensible Stylesheet Language Transformations)は、XMLデータ(注)の構造変換ルールを記述するための言語だ。XSLTは元をただせば、XMLデータの表示・印刷のためのスタイル指定言語XSL(eXtensible Stylesheet Language)の一部だった。しかし、XSLTの用途は表示・印刷にとどまらない柔軟なものだったため、現在ではXSLからは独立した仕様となっている。XSLTを一言でいうならば、あるXMLデータを、別の形式のXMLデータにもHTMLデータにもテキストデータにも変換できる汎用的なツールだ。

(注) W3CによるXMLの仕様書では、XMLで記述された情報を「XML文書(XML Document)」と呼んでいる。しかしXMLは、電子書籍などの文書以外に、電子商取引などのさまざまなデータの記述に用いられる。そこで、本連載ではXMLで記述された文書やデータを総称して「XMLデータ」と呼ぶことにする。


 XMLデータは、ツリーとしてモデル化できる。また、要素などXMLデータを構成する各パーツは、ツリーを構成するノード(node:節点)としてモデル化できる。XSLTは、与えられたXMLのツリーと、XSLTで表現された変換ルールを照らし合わせて、別の構造のXMLツリーを生成する。ここで、元のXMLツリーのことをソースツリー(source tree)、新たに生成されるXMLツリーを結果ツリー(result tree)と呼ぶ。また、XSLTによる変換ルールを記述したXMLデータをスタイルシート(stylesheet)と呼ぶ。このような構造変換を行うソフトウェアのことをXSLTプロセッサ(XSLT processor)と呼ぶ(図1)。

図1 XSLTによるXMLデータの構造変換 図1 XSLTによるXMLデータの構造変換

スタイルシートの基本的な構成

 XMLデータを変換する簡単な例を使って、スタイルシートの仕組みを示そう。リスト1に示すXML形式の仕入先情報を、変換元のXMLデータとして用いる。

<?xml version="1.0" encoding="shift_jis"?>
<supplier>ユニテック商事(株)</supplier>
リスト1 仕入先情報

 これを、リスト2に示すHTML形式に構造変換して、Webブラウザで表示できるようにしたい。

<html>
  <h1>ユニテック商事(株)</h1>
</html>
リスト2 Webブラウザ表示のためにHTML化した仕入先情報

 この構造変換のために記述したスタイルシートをリスト3に示す。

(1)XML宣言
<?xml version="1.0" encoding="shift_jis"?>
 
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

(3)出力指定

  <xsl:output method="html" encoding="shift_jis"/>

(4)テンプレート規則
  <xsl:template match="/">
    <html>
      <xsl:apply-templates/>
    </html>
  </xsl:template>

(5)テンプレート規則
  <xsl:template match="supplier">
    <h1><xsl:value-of select="."/></h1>
  </xsl:template>
(2)
スタイルシートの本体
</xsl:stylesheet>  
リスト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)テンプレート規則
<xsl:template match="/">
…… ルートノードを起点にする

 match属性に「/」という文字が指定されている。XPathでは、XMLツリーの最上位ノードをルートノード(root node)と呼び、「/」で表現する。ルートノードについては後で詳しく述べるが、これは最上位の要素(リスト1でいうとsupplier要素)の親として存在する特別なノードだ

 XSLTプロセッサは、ルートノードを起点にして処理を始める。従って、リスト3のスタイルシートを処理するXSLTプロセッサは、ソースツリーの変換処理を(4)のxsl:template要素のテンプレート規則から始めることが分かる。

 xsl:template要素の「要素の内容」(開始タグと終了タグで囲まれた内容データ)のところに、変換後の構造を記述する。これは、テンプレート(template)と呼ばれる。テンプレートには結果ツリーに加えたい要素や属性のタグをそのまま埋め込むことができる。(4)のxsl:template要素のテンプレートを見ると、結果ツリーに加えたいHTML要素であるhtmlタグがそのまま埋め込まれている。

(4)テンプレート規則
<xsl:template match="/">

  <html>
    <xsl:apply-templates/>
  </html>

</xsl:template>
 
 
…… 結果ツリーに加えたいタグ
 
…… 結果ツリーに加えたいタグ
 
xsl:template要素の属性が“match="/"”とされているため、このテンプレート規則は、ルートノードを起点にして処理を始める。要素の内容となるテンプレートには、結果ツリーに加えたい<html>タグなどをそのまま埋め込むことができる

 変換の仕方を指示するXSLT要素を、命令(instruction)と呼ぶ。テンプレートには結果ツリー生成に必要なXSLT命令も書き込むことができる。(4)のテンプレートに出現しているxsl:apply-templates要素もXSLT命令の1つだ。

(4)テンプレート規則
<xsl:template match="/">
  <html>
    <xsl:apply-templates/>
  </html>
</xsl:template>
 
 
 
…… 子ノードを処理するテンプレート規則へ移動
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)テンプレート規則
<xsl:template match="/">
  <html>
    <xsl:apply-templates/>
  <html>
</xsl:template>

(5)テンプレート規則
<xsl:template match="supplier">
  <h1><xsl:value-of select="."/></h1>
</xsl:template>
……
 
 
 
…… ルートノードの子ノードを処理する(5)テンプレート規則へ移動  
 
 
…… ルートノードの子ノードであるsupplier要素の処理を開始
 
(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)テンプレート規則
  <xsl:template match="supplier">
    <h1><value-of select="."/></h1>

 結果として、(5)のxsl:template要素では、以下のツリーが生成される。

<h1>ユニテック商事(株)</h1>

 (5)で生成されたh1要素以下のツリーは、呼び出し元である(4)のxsl:apply-templatesの位置に組み込まれる。最終結果として、リスト2に示す最終的な結果ツリーが完成する。

<html>
  <h1>ユニテック商事(株)</h1>
</html>
リスト2(再掲) Webブラウザ表示のためにHTML化した仕入先情報

次回で扱う内容

 今回は、XSLTの基本的な仕組みについて説明してきた。次回はXMLツリーの中で、特定のノードを正確に特定するための記述言語XPathを解説する。XPathはさまざまな場面で使われるが、XSLTを理解するのにXPathの知識は必須だ。



Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。