web-dev-qa-db-fra.com

Peut-on me donner l'exemple du "mode" de template en xsl?

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?

69
Venkat

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.

84
Dimitre Novatchev
<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

6
Andrew Xie