69 votes

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? Merci d'avance.

84voto

Dimitre Novatchev Points 147842

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.

4voto

Peter Kneale Points 432

-1voto

kciejek Points 1

En utilisant l'exemple de Dimitre Novatchev avec l'attribut mode, je colle du code xsl complet pour imprimer un tableau html.

 <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="/">
        <html>
            <body>
                <table border="1" style="border:1px; width:300px; solid black">
                    <xsl:apply-templates mode="main" />
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="num[position() mod 3 = 1]" mode="main">
        <tr>
            <xsl:apply-templates mode="copy"
                select=". | following-sibling::*[not(position() >2)]" />
        </tr>
    </xsl:template>

    <xsl:template match="num[not(position() mod 3 = 1)]" mode="main">
    </xsl:template>

    <xsl:template match="*" mode="copy">
        <td align="center">
            <xsl:value-of select="." />
        </td>
    </xsl:template>

</xsl:stylesheet>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X