template et call-template


Syntaxe
Il existe deux versions de l'élément template qui se différencient par leurs attributs :
<xsl:template match="XPath" >
    ...
</xsl:template>
<xsl:template name="nom_patron">
    ...
</xsl:template>
La version avec l'attribut match surdéfinit un patron par défaut, applicable à tel type d'élément. Ce patron est instancié par le processeur XSLT à chaque fois qu'un élément correspondant est rencontré. La version avec l'attribut name correspond aux fonctions des langages fonctionnels. Ils sont destinés à êtres "appelés" par l'instruction call-template.

Exemples
XSL Sortie
<xsl:template match="/" >
    ;-)
    <xsl:call-template name="dis_bonjour"/>
</xsl:template>

<xsl:template name="dis_bonjour">
    Bonjour !
</xsl:template>

;-)
Bonjour !
Quelque soit le document XML en entrée, le processeur commence à chercher un patron pouvant s'appliquer à la racine, trouve ici le premier patron dans la feuille de style et l'applique. Ce patron spécifie la génération de texte et l'instanciation du patron dont le nom est dis_bonjour.

Il est possible, comme pour une fonction, de passer à un tel patron des paramètres et de réaliser des appels récursifs :
<xsl:template match="/" >
    énumération :

    <xsl:call-template name="enumer">
        <xsl:with-param name="start">0</xsl:with-param>
        <xsl:with-param name="end">9</xsl:with-param>
    </xsl:call-template>
</xsl:template>

<xsl:template name="enumer">
    <xsl:param name="start"/>
    <xsl:param name="end"/>

    <xsl:value-of select="$start"/>

    <xsl:if test="$start &lt; $end">
        <xsl:call-template name="enumer">
            <xsl:with-param name="start"><xsl:value-of select="$start + 1"/></xsl:with-param>
            <xsl:with-param name="end"><xsl:value-of select="$end"/></xsl:with-param>
        </xsl:call-template>
    </xsl:if>
</xsl:template>
énumération :

0123456789
Il faut enfin noter que le patron est instancié avec le même contexte que l'appelant, c'est à dire que l'élément courant reste le même :
XML
<livre>
    <chapitre titre="Intro"> bla bla intro </chapitre>
    <chapitre titre="Partie 1"> bla bla Partie 1 </chapitre>
    <chapitre titre="Postface"> bla bla Postface </chapitre>
</livre>
XSL Sortie
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template name="suite">
    Suite : <xsl:value-of select="following-sibling::*[position()=1]/@titre"/>
</xsl:template>


<xsl:template match="chapitre">
    Titre : <xsl:value-of select="@titre"/>

    <xsl:value-of select="."/>

    <xsl:call-template name="suite"/>
</xsl:template>

</xsl:stylesheet>
Titre : Intro
bla bla intro
Suite  :  Partie 1 
Titre : Partie1
bla bla Partie 1
Suite : Postface
Titre : Postface
bla bla Postface
Suite :
Cette feuille de style génère pour chaque chapitre son titre, son contenu textuel et le titre du chapitre à venir. Pour ce faire, un appel au patron de nom suite est réalisé dans le patron dédiés aux éléments chapitre. L'expression XPath following-sibling..., dans le patron suite, est relative à "l'élément courant" du patron appelant, à savoir chapitre.

Précédent... ] sommaire... ] Suivant... ]