<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 ライブラリを作成する方法の例になります。