処理の流れ

テンプレートが複数ある場合の処理の流れ

先ほどは、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=" "/>