<xsl:call-template> の例

次の例では、<xsl:call-template> 要素を使って、モジュール方式で XSLT を変換します。この例では、次の 3 つのメイン ファイルを使用します。

  • topic.xml という XML ソース ファイル。このファイルは、刊行された書籍のトピックを表しています。

  • topic.xsl というメイン XSLT ファイル。このファイルは、表示される情報を制御します。

  • ui.xsl という呼び出される XSLT ファイル。このファイルは、情報の表示方法を決定します。

XML ファイル (topic.xml)

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="topic.xsl"?>
<topic name="My_topic"
       title="My Topic">
  <meta>
    <owner>
      <name>Jane</name>
      <email>jane@topicfactory.com</email>
      <since></since>
    </owner>
    <history>
      <created-by>
        <name>John</name>
        <email>john@topicfactory.com</email>
        <date>Nov 5, 2001</date>
      </created-by>
      <modifiers>
      </modifiers>
    </history>
    <keyword></keyword>
    <refs></refs>
  </meta>

  <para name="para1" title="First Paragraph">
    The first para has both name and title.
  </para>
  <para title="Second Paragraph">
     the second para has a title but no name.
  </para>

  <para>
    Third para has neither name nor title.
  </para>
</topic>

メイン XSLT ファイル (topic.xsl)

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:import href="ui.xsl"/>
  <xsl:param name="editable" select="true"/>

  <xsl:template match="/topic">
    <xsl:if test="@title">
      <xsl:call-template name="topic_title">
         <xsl:with-param name="editable" select="$editable"/>
         <xsl:with-param name="value" select="@title"/>
      </xsl:call-template>
    </xsl:if>
    <xsl:apply-templates/>
  </xsl:template>

  <!-- Don't display meta information. -->
  <xsl:template match="meta"/>

  <xsl:template match="para">
    <P>
    <xsl:if test="@title">
      <xsl:call-template name="para_title">
         <xsl:with-param name="value" select="@title"/>
         <xsl:with-param name="editable" select="$editable"/>
      </xsl:call-template>
    </xsl:if>
    <xsl:apply-templates/>
    </P>
  </xsl:template>
  
  <xsl:template match="text()">
    <xsl:call-template name="text">
      <xsl:with-param name="value">
        <xsl:value-of select="."/>
      </xsl:with-param>
      <xsl:with-param name="editable">true</xsl:with-param>
    </xsl:call-template>
  </xsl:template>

</xsl:stylesheet>

コンポーネント XSLT ファイル (ui.xsl)

<xsl:stylesheet version="1.0"
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template name="topic_title">
    <xsl:param name="editable"/>
    <xsl:param name="value"/>
    <H2>
      <xsl:attribute name="CONTENTEDITABLE">
         <xsl:value-of select="$editable"/>
      </xsl:attribute>
      <xsl:value-of select="$value"/>
    </H2>
  </xsl:template>

  <xsl:template name="para_title">
    <xsl:param name="value"/>
    <xsl:param name="editable"/>
    <DIV STYLE="font-size:16;
                font-family:Arial;
                font-weight:bold;
                font-style:italic"
         CONTENTEDITABLE="{$editable}">
      <xsl:value-of select="$value"/>
    </DIV>
  </xsl:template>

  <xsl:template name="text">
    <xsl:param name="value"/>
    <xsl:param name="editable"/>
    <SPAN CONTENTEDITABLE="{$editable}">
      <xsl:value-of select="$value"/>
    </SPAN>
  </xsl:template>


</xsl:stylesheet>

出力

書式付き出力を次に示します。

My Topic

First Paragraph
The first para has both name and title. 

Second Paragraph
the second para has a title but no name. 

Third para has neither name nor title.

これはプロセッサ出力です。

<H2 CONTENTEDITABLE="true">My Topic</H2>
<P>
   <DIV STYLE="font-size:16;
               font-family:Arial;
               font-weight:bold;
               font-style:italic"
        CONTENTEDITABLE="true">First Paragraph<DIV>
   <SPAN CONTENTEDITABLE="true">
     The first para has both name and title.
   </SPAN>
</P>
<P>
   <DIV STYLE="font-size:16;
               font-family:Arial;
               font-weight:bold;
               font-style:italic"
        CONTENTEDITABLE="true">Second Paragraph<DIV>
   <SPAN CONTENTEDITABLE="true">
     The second para has a title but no name.
   </SPAN>
</P>
<P>
   <SPAN CONTENTEDITABLE="true">
     The third para has neither name nor title.
   </SPAN>
</P>

解説

topic.xsl というメイン XSLT ファイルが表示される情報を制御します。このファイルは、<meta> 要素のコンテンツを非表示にし、項目の表示順を制御します。また、ui.xsl というコンポーネント XSLT ファイルで定義されているテンプレート規則を呼び出します。

ui.xsl ファイルには、最初の XSLT ファイルから呼び出すことができる名前付きテンプレート規則のみが含まれています。個々の名前付きテンプレート規則が $value$editable という 2 つの入力パラメータを取り、HTML 出力を生成することで、通常の関数と同じように動作します。$value パラメータでは、表示されるテキストを渡します。$editable では、出力テキストを編集できるかどうかを決定します (Internet Explorer を使用している場合)。ただし、通常の関数と異なり、名前付きテンプレート規則の入力パラメータの順序は、呼び出し側のテンプレート規則で指定されている順序と同じでなくてもかまいません。

テンプレート規則は、ソース XML ドキュメントで定義されているノードとは関係がない点に注意してください。したがって、ui.xsl ファイルが、他のすべての XSLT ファイルから呼び出すことができる汎用の UI ライブラリを作成する方法の例になります。

参照

リファレンス

<xsl:template> 要素
<xsl:with-param> 要素