apply-templates

L'instruction apply-templates apparaît généralement dans l'un des contextes suivant :
<xsl:template match="expression XPath ">
    instructions et/ou sortie à générer
        <xsl:apply-templates/>
    instructions et/ou sortie à générer
</xsl:template>
 ou 
<xsl:template name="nom_template">
    instructions et/ou sortie à générer
        <xsl:apply-templates/>
    instructions et/ou sortie à générer
</xsl:template>
et signifie : "continuer la transformation pour les enfants de l'élément courant (en cours de transformation)".

Exemples
Document XML source
<doc>
    <taggersent>
        <taggertoken wordform="Il" lemma="il" pos="PRO"/>
        <taggertoken wordform="était" lemma="être" pos="VER:sg"/>
        <taggertoken wordform="une" lemma="un" pos="DET:femi:sg"/>
        <taggertoken wordform="fois" lemma="fois" pos="NOM:femi:sg"/>
        <taggertoken wordform="," lemma="," pos="PUN"/>
        <taggertoken wordform="les" lemma="le" pos="DET:masc:pl"/>
        <taggertoken wordform="voleurs" lemma="voleur" pos="NOM:masc:pl"/>
        <taggertoken wordform="étaient" lemma="étayer|être" pos="VER:pl"/>
        <taggertoken wordform="dans" lemma="dans" pos="PRP"/>
        <taggertoken wordform="la" lemma="le" pos="DET:femi:sg"/>
        <taggertoken wordform="forêt" lemma="forêt" pos="NOM:femi:sg"/>
        <taggertoken wordform="." lemma="." pos="PUN"/>
    </taggersent>
</doc>
XSL
Sans apply-templates :
Résultat
<xsl:template match="/">
     Liste des tokens :
</xsl:template>

<xsl:template match="taggertoken[pos != 'PUN']">
    Forme : <xsl:value-of select="@wordform"/>
    Lemme : <xsl:value-of select="@lemma"/>
</xsl:template>
  
Liste des tokens :

Le processeur commence la transformation en cherchant un patron pour la racine du document, en trouve un correspondant dans la feuille de style et l'applique. Il génère en sortie le texte "Liste des tokens", comme spécifié dans le patron. L'arbre a été traité et la transformation s'arrète sans considérer les descendants de la racine. Le deuxième patron n'est jamais utilisé.
Avec apply-templates :
<xsl:template match="/">
    Liste des tokens :
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="taggertoken[pos != 'PUN']">
    Forme : <xsl:value-of select="@wordform"/>
    Lemme : <xsl:value-of select="@lemma"/>
</xsl:template>
  
Liste des tokens :

Forme : Il
Lemme : il

Forme : était
Lemme : être

Forme : une
Lemme : un

Forme : fois
Lemme : fois


Forme : les
Lemme : le

Forme : voleurs
Lemme : voleur

Forme : étaient
Lemme : étayer|être

Forme : dans
Lemme : dans

Forme : la
Lemme : le

Forme : forêt
Lemme : forêt
La transformation commence de la même manière : la patron correspondant à la racine est appliqué, le texte "Liste des tokens" est reproduit en sortie. L'instruction apply-templates  intime au processeur de poursuivre la transformation pour les enfants de l'élément courant. Pour les éléments doc et taggersent, pas de patron défini, le patron par défaut est alors appliqué et indique qu'il faut continuer la transformation en descendant dans l'arborescence. Lorsque le processeur rencontre les éléments taggertoken qui ne sont pas des signes de ponctuation, le patron correspondant est appliqué. Pour les taggertoken qui sont des signes de ponctuation, aucun patron n'est défini, les éléments n'ont ni enfants ni valeur textuelle, la sortie correspondante est vide.

Tricky : variantes avec attributs
  • mode
    L'instruction apply-template peut être agrémentée de plusieurs attributs. Nous avons vu dans la section priorités que plusieurs templates peuvent être applicables aux mêmes éléments. Dans ce cas, il est possible de spécifier le template à appliquer. En reprenant le document XML source précédent, définissons deux templates pour les éléments taggertoken :
    <xsl:template match="/">
        Liste des tokens :
        <xsl:apply-templates mode="lemme"/>
    </xsl:template>

    <xsl:template match="taggertoken" mode="lemme">
        Lemme : <xsl:value-of select="@lemma"/>
    </xsl:template>

    <xsl:template match="taggertoken" mode="forme">
        Forme : <xsl:value-of select="@wordform"/>
    </xsl:template>
      
    Liste des tokens :

    Lemme : il
    Lemme : être
    Lemme : un
    Lemme : fois
    Lemme : le
    Lemme : voleur
    Lemme : étayer|être
    Lemme : dans
    Lemme : le
    Lemme : forêt
    Lemme : .
    <xsl:template match="/">
        Liste des tokens :
        <xsl:apply-templates mode="forme"/>
    </xsl:template>

    <xsl:template match="taggertoken" mode="lemme">
        Lemme : <xsl:value-of select="@lemma"/>
    </xsl:template>

    <xsl:template match="taggertoken" mode="forme">
        Forme : <xsl:value-of select="@wordform"/>
    </xsl:template>
      
    Liste des tokens :

    Forme : Il
    Forme : était
    Forme : une
    Forme : fois
    Forme : les
    Forme : voleurs
    Forme : étaient
    Forme : dans
    Forme : la
    Forme : forêt
    Forme : .
    L'attribut mode permet de sélectionner lequel des patrons éligibles doit être sélectionné. En l'absence de cet attribut, aucun des patrons n'étant plus spécifique que l'autre, il serait impossible de savoir lequel des deux le processeur XSLT choisirait.
  • select
    La signification par défaut de l'instruction apply-templates est de faire opérer par le processeur les transformations sur les enfants de l'élément courant. L'attribut select permet de modifier ce comportement en spécifiant au processeur une liste d'autres noeuds à traiter. Supposons que nous voulions extraire du document tous les tokens pour lesquels il y a ambigüité sur le lemme et afficher le contexte (phrase) dans lequel il se trouve :
    <xsl:template match="/">
        Tokens avec lemme ambigüs :

        <xsl:for-each select="//taggertoken[contains(@lemma, '|')]">
            Forme  : <xsl:value-of select="@wordform"/>
            Lemme : <xsl:value-of select="@lemma"/>
            Contexte : <xsl:apply-templates select=".."/>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="taggersent">
        <xsl:apply-templates/>
    </xsl:template>


    <xsl:template match="taggertoken">
        <xsl:value-of select="@wordform"/>
    </xsl:template>
      
    Tokens avec lemme ambigüs :

    Forme : étaient
    lemme : étayer|être
    Contexte : Il était une fois, les voleurs étaient dans la forêt.
  • with-param
    Comme dans l'instruction call-template, il est possible de passer des paramètres au template qui va être instancié. Son usage est assez rare mais peut se révéler pratique.
    Un cas d'utilisation est donné dans la page Exemples/extraction d'une liste de tokens.


Précédent... ] Sommaire... ] Suivant... ]