先ほどは、book要素が一つだけの例を扱いましたが、今度はbook要素が複数存在する場合を考えます。
例えば、次のようなXMLがあったとします。
<?xml version="1.0" encoding="utf-8"?> <booklist> <book> <title>オブジェクト指向のためのJava入門</title> <author>増田英孝</author> </book> <book> <title>Javaルールブック</title> <author>電通国際情報サービス 開発技術部</author> </book> <book> <title>サーブレットJSPプログラミングテクニック</title> <author>今野、戸田、藤村、高安、西川</author> </book> </booklist>
このXMLに対して、複数のvalue-of要素を用いたXSLTを適用しても、最初に現れるbook要素しか取り出すことができません。
複数のbook要素を変換するようなケースでは、繰り返し処理を行う必要があります。 繰り返し処理を行う際には、その要素に対してテンプレートを記述します。
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="utf-8"/><xsl:template match="/"> <html> <head> <title>書籍一覧</title> </head> <body> <h1>書籍一覧</h1> <hr/> <xsl:apply-templates select="booklist/book"/> </body> </html> </xsl:template><xsl:template match="book"> <p>書名: <xsl:value-of select="title"/></p> <p>著者: <xsl:value-of select="author"/></p> <hr/> </xsl:template></xsl:stylesheet>
この例では 2つの template 要素があります。 テンプレートが複数ある場合、match="/"、つまり文書全体にマッチするテンプレートが最初に選択されます。 template 要素では、そのテンプレートがどの要素を処理する際のテンプレートであるかを match 属性の値で指定します。 この例では、book要素の繰り返し処理を行うため、book要素を変換する際のテンプレートが記述されています。
ここでポイントとなるのは次の表現です。
<xsl:apply-templates select="booklist/book"/>
XSLプロセッサは、 文書全体("/")に適用するテンプレートを処理していると、 この xsl:apply-templates に遭遇します。 ここで、"/"に対するテンプレートの処理は一時中断し、 select属性で指定されている "booklist"の子要素である"book" に対してテンプレートの適用を行います。
XSLプロセッサがテンプレートを適用中の要素をカレントノードまたは文脈ノードと呼びます。 この例では、最初はカレントノードが"/"ですが、 select="booklist/book"によって処理が"booklist/book"のテンプレートに移り、 カレントノードは"booklist"の子要素の"book"になります。
ここでは、テンプレートを2つ記述した例を挙げましたが、テンプレートはいくつでも記述することができます。下記は、テンプレートを4つ記述した例です。
select属性で指定したノード以下からテキストを取り出すことができます。
<xsl:value-of select="式 "/>
式 を「.」とすれば、カレントノードからテキストを取り出せます。
select属性で指定したノード以下のすべてを出力文書にコピーすることができます。
<xsl:copy-of select="式 "/>