Dans
<xsl:template name="temp_name" mode="mode">
Quelle est la signification de mode
? J'ai cherché beaucoup de ressources, mais je n'ai pas pu trouver d'exemple pour cela. Alors, quelqu'un peut-il expliquer avec un exemple?
Ce n'est pas trop significatif de donner à un modèle à la fois un nom et un mode.
L'attribut name
identifie complètement un modèle et il ne peut pas y avoir deux modèles avec le même nom et des modes différents.
L'attribut mode
permet de traiter plusieurs fois les mêmes nœuds, en utilisant différents modes.
Voici un petit 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), contenant chacune trois colonnes (à l'exception possible 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 élément num
dont la position ne peut pas être représentée sous la forme 3*k +1
(où k
est un entier), correspond à un modèle avec un corps vide et n'est donc pas traité.
Cependant, nous voulons traiter tous les éléments num
qui devraient former les cellules d'une ligne. Pour ce but, nous les traitons à l'aide de l'instruction xslt:
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
ce qui signifie: "Ne pas appliquer aux modèles de nœuds sélectionnés qui seraient normalement appliqués (en aucun mode), mais appliquer des modèles qui sont en mode copy
"
Ainsi, nous n'ignorons pas les éléments num
sélectionnés, mais nous les traitons en mode copy
et créons les td
s d'une ligne.
La règle du modèle:
<xsl:template match="num"/>
est nécessaire pour remplacer les modèles intégrés xslt (traitement par défaut) qui entraîneraient autrement les valeurs de chaîne des nœuds num
dont la position ne peut pas être représentée comme 3*k +1
, à afficher.
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 souhaité.
Il serait instructif de progresser avec un bon débogueur XSLT afin de voir comment ces modèles sont appliqués.
<xsl:apply-templates select="phone" />
<xsl:apply-templates select="phone" mode="accountNumber"/>
<xsl:template match="phone">
<TD>A</TD>
</xsl:template>
<xsl:template match="phone" mode="accountNumber">
<TD>B</TD>
</xsl:template>
Liez un exemple simple ici: https://msdn.Microsoft.com/en-us/library/ms256045%28v=vs.110%29.aspx