目次へ

2.3 テンプレートルールの適用

XSLT プロセッサは、入力 XML 文書を先頭から末尾に向かって読み、その文書のルートノードから開始し、子孫ノードへと処理を進めます。テンプレートルールは、この走査の間に遭遇した要素にマッチした順番で取り上げられます。これは、親要素のテンプレートルールが、その親の子要素にマッチする前に適用されることを意味します。

テンプレートができることの1つに、文書を走査する順番を変更することがあります。テンプレートは、どの要素が次に処理されるべきかを指定することができます。また、特定の要素が処理されないようにすることもできます。

<xsl:apply-templates
  select = node-set-expression
  mode = qname>
  <!-- Content: (xsl:sort | xsl:with-param)* -->
</xsl:apply-templates> 

処理の順番を明示的に選択してテンプレートルールを適用するには xsl:apply-templates 要素を使用します。select 属性は XPath 式によって選択されたノード集合を処理するときに使われますが、select 属性がない場合は、テキストノードを含むカレントノードのすべての子を処理します。カレントノードとは処理の起点となるノードのことをいい、具体的には template 要素の match 属性の属性値で指定されたノードとなります。xsl:apply-templates 要素はソース要素の子を再帰的に処理します。

<xsl:template match="name">
  <xsl:value-of select="last_name" />,
  <xsl:value-of select="first_name" />
</xsl:template>
<xsl:template match="person">
  <xsl:apply-templates/>
</xsl:template>

上のテンプレートルールのみを含むスタイルシートを people.xml に適用すると以下のテキストが出力されます。

<?xml version="1.0" encoding="utf-8"?>

  
    Turing,
    Alan
    computer scientist
    mathematician
    cryptographer
  
  
    Feynman,
    Richard
    physicist
    playing the bongoes
  

select 属性を使用すると、すべての子を処理するのではなく、属性値で選択したノードだけを処理できます。 select 属性の値は、 XPath 式であり、評価した結果ノード集合でなくてはなりません。選択したノード集合の処理は、後の章で説明するソートの指定がなければドキュメント順に行われます。

<xsl:template match="name">
  <xsl:value-of select="last_name" />,
  <xsl:value-of select="first_name" />
</xsl:template>
<xsl:template match="person">
  <xsl:apply-templates select="name"/>
</xsl:template>

上のテンプレートルールのみを含むスタイルシートを people.xml に適用すると以下のテキストが出力されます。

<?xml version="1.0" encoding="utf-8"?>

  Turing,
    Alan
  Feynman,
    Richard

また、カレントノードの子孫でない要素も処理できますし、複数の xsl:apply-templates 要素を 1つの xsl:template 要素内で使用することもできます。

マッチする子孫が 2つ存在し、その一方が他方の子孫となっている可能性もあります。この場合も、特別には扱われずに、両方の子孫とも通常どおり処理されます。たとえば、以下のような XML 文書があったとします。

<doc>
  <div>
    <div></div>
  </div>
</doc>

このルールでは、

<xsl:template match="doc">
  <xsl:apply-templates select=".//div"/>
</xsl:template>

は、外側の div 要素と内側の div 要素の両方を処理します。

一般的に WEB ブラウザで表示することも多いと思いますので、次に文書全体に HTML タグを適用した形で出力してみましょう。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="people">
    <html>
      <head><title>Famous Scientists</title></head>
      <body><xsl:apply-templates /></body>
    </html>
  </xsl:template>
  <xsl:template match="name">
    <p><xsl:value-of select="last_name" />,
    <xsl:value-of select="first_name" /></p>
  </xsl:template>
  <xsl:template match="person">
    <xsl:apply-templates select="name"/>
  </xsl:template>
</xsl:stylesheet>

上記のスタイルシートを people.xml に適用すると以下のテキストが出力されます。

<html>
<head>
<title>Famous Scientists</title>
</head>
<body>
  <p>Turing,
    Alan</p>
  <p>Feynman,
    Richard</p>
</body>
</html>

今までの例でみてきた出力テキストと決定的に違う点があります。それは、XML 宣言が出力されていないことです。XSLT プロセッサは出力のルート要素が html であることを検知すると HTML 形式でテキストを出力します。このように HTML を出力することはよくあることなので、XSLT は HTML を処理するためだけの特別ルールを持っています。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp