- 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>