Définissons et utilisons les templates nommés comme des "macros" ou "fonctions" avec des paramètres.
| feuille18.xsl appliquée sur atomes.xml --> famille_atome.xml |
<xsl:template match="classification_atomique">
<xsl:copy>
<xsl:call-template name="categorie">
<xsl:with-param name="type_categorie">
gaz rare</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="categorie">
<xsl:with-param name="type_categorie">
métal alcalin</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="categorie">
<xsl:with-param name="type_categorie">
métal alcalino-terreux</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="categorie">
<xsl:with-param name="type_categorie">
non métal</xsl:with-param>
</xsl:call-template>
</xsl:copy>
</xsl:template>
<xsl:template name="categorie">
<xsl:param name="type_categorie"/>
<xsl:element name="famille">
<xsl:attribute name="type">
<xsl:value-of select="$type_categorie"/>
</xsl:attribute>
<xsl:for-each select="atome[type=$type_categorie]">
<xsl:call-template name="atome"/>
</xsl:for-each>
</xsl:element>
</xsl:template>
|
Les templates nommés (attribut name) se comportent comme
des fonctions. L'appel se fait par l'instruction xsl:call-template.
Pour pouvoir passer des paramètres, il suffit de les définir
dans le template par l'instruction param, et de les "passer"
dans le call-template par l'instruction with-param.
Içi, le template nommé catégorie traite/formate
tous les atomes de sa catégorie : le paramètre est
famille. Dans le traitement principal, le template catégorie
est appelé respectivement avec les valeurs : "gaz
rare", "métal alcalin", "métal
alcalino-terreux", "non métal".
<xsl:call-template name="nom"/>
<xsl:call-template name="nom"> passage de valeurs
aux paramètres </xsl:call-template>
applique le template de même nom sur le noeud courant, avec
éventuellement des valeurs passées aux paramètres
s'il y en a.
<xsl:param name="nom"/>
<xsl:param name="nom"> valeur par défaut
du paramètre </xsl:param>
définit un paramètre d'un template avec éventuellement
une valeur par défaut. xsl:param doit figurer juste après
xsl:template ou xsl:param.
<xsl:with-param name="nom"/>
valeur passée au paramètre </xsl:with-param>
définit la valeur passée à un paramètre
d'un template lors d'un appel à ce template par l'instruction
call-template. xsl:with-param doit figurer juste après
xsl:call-template ou xsl:with-param.
Donnez un fichier organisé autour des colonnes 1 et 3 comme suit:
$ java Transform feuille18exo.xsl atomes.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<classification_atomique>
<colonne type="1">
<atome>
<nom>hydrogène</nom>
<symbole>H</symbole>
<numero>1</numero>
<masse>1</masse>
</atome>
<atome>
<nom>lithium</nom>
<symbole>Li</symbole>
<numero>3</numero>
<masse>7</masse>
</atome>
<atome>
<nom>sodium</nom>
<symbole>Na</symbole>
<numero>11</numero>
<masse>23</masse>
</atome>
</colonne>
<colonne type="3">
...