call-template, with-param, param

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.

Exercice :

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">
...

 index  suivant