- 2.1 テンプレートルールの定義
- 2.2 テキストの動的生成
- 2.3 テンプレートルールの適用
- 2.4 モード
- 2.5 名前付きテンプレート
2.4 モード
同じ入力内容に異なるテンプレートを何回も適用したいことがあります。xsl:template 要素と xsl:apply-templates 要素は、異なるテンプレートルールを異なる用途に結びつける mode 属性を任意に持つことができます。xsl:template 要素の mode 属性は、どのモードの場合に適用されるかを指定します。原則として、xsl:template は match 属性か name 属性のいずれかを持てばいいのですが、mode 属性を指定する場合、必ず match 属性を持つ必要があります。xsl:apply-templates 要素の mode 属性は、どのモードのテンプレートルールを適用するかを指定します。
<?xml version="1.0"?>
<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>
<ul><xsl:apply-templates select="person" mode="toc"/></ul>
<xsl:apply-templates select="person"/>
</body>
</html>
</xsl:template>
<xsl:template match="person" mode="toc">
<xsl:apply-templates select="name" mode="toc"/>
</xsl:template>
<xsl:template match="name" mode="toc">
<li><xsl:value-of select="last_name" />,
<xsl:value-of select="first_name" /></li>
</xsl:template>
<xsl:template match="person">
<p><xsl:apply-templates /></p>
</xsl:template>
</xsl:stylesheet>
上記のスタイルシートを people.xml に適用すると以下のテキストが出力されます。
<html>
<head>
<title>Famous Scientists</title>
</head>
<body>
<ul>
<li>Turing,
Alan</li>
<li>Feynman,
Richard</li>
</ul>
<p>
Alan
Turing
computer scientist
mathematician
cryptographer
</p>
<p>
Richard
P
Feynman
physicist
playing the bongoes
</p>
</body>
</html>
people テンプレートは、子要素 person に 2回テンプレートを適用します。最初に toc モードでテンプレートを適用し、次にモードが指定されていないテンプレートを適用します。
2.5 名前付きテンプレート
<xsl:call-template name = qname> </xsl:call-template>
xsl:call-template 要素は、name 属性を持つ xsl:template 要素のテンプレート名を指定することにより、テンプレートを名前で呼び出すことができます。名前でテンプレートを呼び出すため、xsl:call-template 要素は呼び出すテンプレートを識別するための name 属性を持たなければなりません。name 属性の属性値には呼び出すテンプレートの名前を指定します。xsl:template 要素は name 属性を持つ場合、match 属性を指定してもしなくてもかまいません。 xsl:call-template は、xsl:apply-templates と異なり、カレントノードやカレントノードリストを変更しません。
以下に A という名前のテンプレートを呼び出す例を示します。
<xsl:template match="/"> <xsl:call-templates name="A" /> </xsl:template> <xsl:template name="A"> <xsl:apply-templates select="info" /> </xsl:template>

