Exemple de <xsl:call-template>
L'exemple suivant utilise l'élément <xsl:call-template> pour transformer XSLT de manière modulaire. L'exemple utilise trois fichiers principaux :
le fichier source XML, topic.xml, qui représente une rubrique dans un livre ;
le fichier XSLT principal, topic.xsl, qui contrôle les informations affichées ;
le fichier XSLT nommé, ui.xsl, qui détermine la manière dont les informations sont présentées.
Fichier 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>
Fichier XSLT principal (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>
Fichier XSLT composant (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>
Sortie
Voici les données en sortie formatées :
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.
Voici les données en sortie du processeur :
<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>
Notes
Le fichier XSLT principal, topic.xsl, contrôle quelles sont les informations affichées. Il masque le contenu de l'élément <meta> et contrôle l'ordre des éléments affichés. Il appelle également les règles de modèle définies dans le fichier XSLT composant, ui.xsl.
Le fichier ui.xsl contient uniquement les règles de modèle nommées qui peuvent être appelées depuis le premier fichier XSLT. Chaque règle de modèle nommée agit comme une fonction régulière, en prenant deux paramètres d'entrée $value et $editable et en produisant une sortie HTML. Le paramètre $value transmet le texte à afficher ; $editable est utilisé pour déterminer si le texte de sortie peut être modifié (en cas d'utilisation de Internet Explorer). Toutefois, contrairement à une fonction régulière, l'ordre des paramètres d'entrée dans la règle de modèle nommée ne doit pas obligatoirement respecter l'ordre spécifié dans la règle de modèle appelante.
Notez que les règles de modèle sont indépendantes des nœuds définis dans le document XML source. Le fichier ui.xsl illustre dès lors la manière dont vous pouvez écrire une bibliothèque d'interface utilisateur à usage général pouvant être invoquée depuis n'importe quel autre fichier XSLT.