処理の流れ

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

ここまではテンプレートが1つしかないスタイルシートを扱ってきましたが、 実際には複数のテンプレートを記述することができます。 テンプレートが複数ある場合、match="/"、つまり文書全体にマッチするテンプレートが最初に選択されます。

次の例を見てみましょう。

ここでは、HTML文書に変換する場合のXSLスタイルシートを詳しく見てみます。

<?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"
              doctype-public="-//W3C//DTD HTML 4.01//EN"
              doctype-system="http://www.w3.org/TR/html4/strict.dtd" />

  <xsl:template match="/">
     <html lang="ja">
       <head>
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
         <title>Rock Festivals</title>
       </head>
       <body>
         <xsl:apply-templates select="festivals"/>
       </body>
     </html>
  </xsl:template>
  <xsl:template match="festivals">
    <h1>国内ロックフェスティバル</h1>
    <xsl:apply-templates select="festival"/>
  </xsl:template>
  <xsl:template match="festival">
    <h2><xsl:value-of select="name"/></h2>
    <h3>出演予定バンド/アーティスト</h3>
    <ul>
      <xsl:apply-templates select="bands/band"/>
    </ul>
  </xsl:template>
  <xsl:template match="band">
    <li><xsl:value-of select="."/></li>
  </xsl:template>
</xsl:stylesheet>

この例では 4つの template 要素があります。 template 要素では、そのテンプレートがどの要素を処理する際のテンプレートであるかを match 属性の値で指定します。 この例では、 /, festivals, festival, band の4つの要素を変換する際のテンプレートが記述されています。

ここでポイントとなるのは次の表現です。

  <xsl:apply-templates select="festivals"/>

XSLプロセッサは、 文書全体("/")に適用するテンプレートを処理していると、 この xsl:apply-templates に遭遇します。 ここで、"/"に対するテンプレートの処理は一時中断し、 select属性で指定されている "festivals" に対してテンプレートの適用を行います。

XSLプロセッサがテンプレートを適用中の要素をカレントノードまたは文脈ノードと呼びます。 この例では、最初はカレントノードが"/"ですが、 select="festivals"によって処理が"festivals"のテンプレートに移り、 カレントノードは"/"の子要素の"festivals"になります。

データの取り出し

テキストの取り出し

select属性で指定したノード以下からテキストを取り出すことができます。

  <xsl:value-of select=" "/>

を「.」とすれば、カレントノードからテキストを取り出せます。

要素の取り出し

select属性で指定したノード以下のすべてを出力文書にコピーすることができます。

  <xsl:copy-of select=" "/>