ここまではテンプレートが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="式 "/>