今野 英明
平成26年5月26日
この資料では XSLT 言語の基礎と,XML 文書からデータの検索や抽出を行うための方法を学ぶ。
XSLT を利用するには, XML 文書をどのように変換するかを書いた XSLT スタイルシートを作り, XML 文書と XSLT スタイルシートを XSLT プロセッサで処理する。
図 1の左側に XML 文書の一例を示す。 この文書のルート要素は ref であり,ref の内容は book や web 等の要素である。
XSLT では,XML 文書を木 (tree) 構造を持つデータとして扱う。 図 1の右側は, 左側の XML 文書を XSLT のデータモデル (木) として描画したものである。 この木における / や ref などをノード (node) と呼ぶ 2。
![]() |
この木には,次に記す種類のノードがある3。
XML 文書をモデル化した木からノードを指定する記述がロケーションパス (location path) である。 この資料で扱うのはロケーションパスの省略記法のみであり,この場合,ロケーションパスの基本的な記述法はディレクトリやファイルのパス名と同じである。 以下で示すロケーションパスの例は図 1におけるものである。 なお,ロケーションパスは XPath (XML Path Language) という規格で定められている 4。
例:/ref/web/title
例:/ref/book/@isbn
ノードセットの指定には,次のようなロケーションパスを用いることもできる。
/ref/* ref ノードのすべての子要素ノード /ref/book/@* book ノードのすべての子属性ノード //title ルートノードの子孫であるすべての title 要素ノード /ref//title ref ノードの子孫の中のすべての title 要素ノード /ref/book |
/ref/webref ノードの子要素ノード book と web をあわせたノードセット
/ref/book[2] 2 番目の book 要素ノード /ref/book[@isbn='1111'] isbn 属性が 1111 である book 要素ノード /ref/book[author] author 要素ノードを子に持つ book 要素ノード /ref/book[2]/title 2 番目の book ノードの子である title 要素ノード
相対ロケーションパスでは,基点となるノードを . (ドット)で表し,親ノードを .. (ドット二つ)で表す。
第 2.1 節の木において,仮りに web を基点とすれば,相対ロケーションパスの例は次のとおりとなる。
web の子ノードの title は ./title または title
ref は .. であり,/ は ../..
isbn は ../book/@isbn
相対ロケーションパスの実際の基点(= ドット . で表されるノード)は,XSLT では カレントノード (current node) と呼ばれる現在処理中のノードである6。 カレントノードについては,次回の資料で触れる。
なお,相対ロケーションパスでも,第 2.2.3 節で紹介したノードの絞り込みが可能である。
XSLT スタイルシートは,XML 文書をどのような形に変換するかを,XSLT で記したものである 7。 なお,以下では XSLT スタイルシートを,単にスタイルシートと呼ぶことがある。
次の例は,変換対象となる XML 文書から,
XML 宣言やタグ等を除いた文字データ部分をすべて出力するスタイルシートである。
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8" /> <xsl:template match="/"> <xsl:value-of select="/" /> </xsl:template> </xsl:stylesheet>
XSLT スタイルシート自体も整形式の XML 文書なので, スタイルシートにも前回資料にある XML の用語(XML 宣言や要素,属性等) や規則が当てはまる。 加えて XSLT 独自の規則等があるが,ここでは,ロケーションパスで指定されたノードの値(文字列値)を XML 文書から取り出すことができる xsl:value-of 要素に関わることのみを説明し, 他の要素については次回に概要を説明する。
書式は次の通りである。
<xsl:value-of select="expression" />
expression として,単一のノードに対応するロケーションパスを指定すれば, xsl:value-of はそのノードの文字列値を XML 文書から取り出す。 複数のノード(ノードセット)に対応するロケーションパスを指定すれば, ノードセット中の最初のノードの文字列値のみを取り出す。
例えば,先のスタイルシートにおける <xsl:value-of select="/" /> は XML 文書からルートノード (/) の文字列値, すなわち XML 文書内の文字データ部分をすべて取り出すものである。
expression には,次の例のように,XSLT の関数も書ける。
<xsl:value-of select="count(/ref/book)" />関数 count は,引数に与えられたノードセットのノード数を返すものであり, この xsl:value-of 要素を含むスタイルシートを図 1の XML 文書に適用すれば /ref/book のノード数である 2 が出力される。
ここでは,XSLT プロセッサとして xsltproc コマンドを用いる。 実行の書式は次のとおり。
xsltproc [option] stylesheet file ...ここで, stylesheet と file は,各々, XSLT スタイルシートと XML 文書の入ったファイルの名前である。 例えば,
xsltproc /pub/db_a/xml/all.xsl /pub/db_a/xml/ref.xmlは, XSLT スタイルシート /pub/db_a/xml/all.xsl の内容に則って XML 文書 /pub/db_a/xml/ref.xml を変換し, 結果を標準出力(画面)に出力する。 結果をファイルに入れたければ, リダイレクト (
>
file) を使えばよい。
以下の問題では,xsltproc コマンドを使って, 設問で指定された XML 文書に XSLT スタイルシートを適用して処理する。 今回の練習問題では, 第 3 章の XSLT スタイルシートにおける xsl:value-of 要素の属性値だけを変更すればよい。 なお,このスタイルシートは /pub/db_a/xml/all.xsl として実習用コンピュータにおいてあるので,これを各自のホームディレクトリ配下のどこかにコピーして,必要な箇所だけを変更すればよい。 また,この問題では,出力における空白や改行の乱れは無視してよい。
XSLT で使われるノードには,この他にコメントノード,処理命令ノード,名前空間ノードがある。