目次へ

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>

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp