Il n'est pas trop important pour donner un modèle à la fois un nom et un mode.
L' name
d'attribut s'identifie totalement un modèle et il ne peut y avoir deux modèles avec le même nom et les différents modes.
L' mode
attribut permet les mêmes nœuds à être traité plus d'une fois, en utilisant différents modes.
Voici un court exemple:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="num[position() mod 3 = 1]">
<tr>
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
</tr>
</xsl:template>
<xsl:template match="*" mode="copy">
<td><xsl:value-of select="."/></td>
</xsl:template>
<xsl:template match="num"/>
</xsl:stylesheet>
Lorsque cette transformation est appliquée sur le document XML suivant:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
Le résultat est que les nombres sont affichés dans trois tr
(lignes), chacune contenant trois colonnes (avec la possible exception de la dernière ligne):
<tr>
<td>01</td>
<td>02</td>
<td>03</td>
</tr>
<tr>
<td>04</td>
<td>05</td>
<td>06</td>
</tr>
<tr>
<td>07</td>
<td>08</td>
<td>09</td>
</tr>
<tr>
<td>10</td>
</tr>
Dans cette transformation, tout num
élément à la position qui ne peut être représenté sous la forme 3*k +1
(où k
est un entier), est compensée par un modèle avec corps est vide et donc n'est pas traitée.
Cependant, nous voulons traiter tous num
éléments qui devraient constituer les cellules d'une rangée. Pour ce purpuse, nous sommes de les traiter à l'aide de l'instruction xslt:
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
ce qui signifie: "Ne s'appliquent pas aux nœuds sélectionnés modèles qui devraient normalement être appliquée (dans aucun mode), mais appliquer des modèles qui sont en copy
mode"
Ainsi, nous n'avons pas ignorer l'sélectionnée num
éléments, mais leur transformation en copy
mode et de la création de l' td
s d'une ligne.
Le modèle de la règle:
<xsl:template match="num"/>
est nécessaire de remplacer la xslt builtin modèles (traitement par défaut) qui pourrait entraîner la chaîne de valeurs de l' num
des nœuds dont la position ne peut pas être représenté comme 3*k +1
, à être de sortie.
Donc, ces nœuds sont traités par les deux modèles:
<xsl:template match="num"/>
et
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
et ainsi, nous obtenons le résultat voulu.
Il serait instructif d'étape avec un bon débogueur XSLT afin de voir comment ces modèles sont appliqués.