<?xml version="1.0" encoding="UTF-8" ?> <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:for-each select="/ref/book"> <xsl:value-of select="title" /> <xsl:value-of select="author" /> </xsl:for-each> </xsl:template> </xsl:stylesheet>これを XML 文書例に適用すると, 次の出力が得られる1。
Title1Author1Title2Author2以下では,上記のスタイルシートのうち, xsl:for-each の動作に関わる部分について説明する。
出力を具体的に記述する部分(テンプレート)の始まり。
属性 match="/" の指定により, ルートノード (/) がカレントノードになるため, テンプレート内の初期の 相対ロケーションパスの基点 は / になる。
xsl:for-each 要素は, select 属性で指定されたノードの集まり(ノードセット) の中の各ノードを逐次カレントノードにしながら, 終了タグ </xsl:for-each> の前まで(要素の内容) に記述された処理を繰り返して行うものである。
XML 文書例を処理する場合, /ref/book は二つのノードに対応するので, xsl:for-each 要素の内容は 2 回反復処理される。
なお, この開始タグが現れた段階でのカレントノードは / であるため, select 属性値を 相対ロケーションパスの ref/book や ./ref/book としても動作は同じ。
xsl:for-each 要素による繰り返しの対象部分。 XML 文書例に対しては,次の動作が起きる。
このとき,xsl:value-of の select 属性値である title と author(相対ロケーションパスでの指定) は,絶対ロケーションパスでの /ref/book[1]/title および /ref/book[1]/author に等しい。
従って,xsl:value-of 要素によって, それらの文字列値である Title1 と Author1 が出力される。
反復 1 回目と同様に,xsl:value-of によって, /ref/book[2]/title および /ref/book[2]/author の文字列値である Title2 と Author2 が出力される。
xsl:for-each 要素の終了タグ。 xsl:for-each 要素が終わると,カレントノードは以前のもの (このスタイルシートでは xsl:template で指定された / )に戻る。 そのため,この後に相対ロケーションパスを含むテンプレート記述があれば, その起点は再度 / になる。
<xsl:for-each select="/ref/book"> <xsl:sort order="descending"/> <xsl:value-of select="title" /> <xsl:text> </xsl:text> <xsl:value-of select="author" /> <xsl:text> </xsl:text> </xsl:for-each>に変更して,XML 文書例を処理すると,出力は次のとおりとなる。
Title2 Author2 Title1 Author1この出力を得るために行っているテンプレート内の処理について,以下に記す。
例えば,先の <xsl:sort order="descending"/> は, 出力される文字列値が辞書の逆順(降順)になるように, xsl:for-each が処理するノードの順序を並べ換えるものである。
xsl:order 要素の動作を変更する属性は幾つかあり, order 属性は並べ換えの順を指定するものである。 属性値には ascending (昇順)か descending (降順)を指定する (order 属性を略すと昇順になる)。
他の属性としては,並べ換えに使うキーを指定する select 属性があり, <xsl:sort select="author" order="descending"/> とすれば,author ノードの文字列値が降順になるように, 処理順序の並べ換えが行われる。
テンプレートに記述した空白や改行を出力したければ, xsl:text 要素が使える。 例えば,内容が空白文字である xsl:text 要素
<xsl:text> </xsl:text>や
<xsl:text> </xsl:text>をテンプレート内に書けば,空白や改行を出力できる。
xsl:sort 要素の使い方も確認してみなさい。