IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

[XSLT] Ordre d'application de templates


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut [XSLT] Ordre d'application de templates
    Salut,

    Je souhaiterais pouvoir définir l'ordre dans lequel doivent s'appliquer mes templates sans tenir compte de l'ordre de mon fichier xml, mais évidemment si je poste encore par ici, c'est que je ne sais pas si c'est possible...

    J'ai dans toutes mes feuilles xslt des includes qui peuvent être parfois différents, exemple en gros d'une de mes pages xsl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:include href="basepage.xsl" />
    <xsl:include href="listecategorie.xsl" />
    <xsl:include href="sondage.xsl" />
     
    <xsl:template match="contenu_de_ma_page">
    ...
    </xsl:template>
    Dans basepage.xsl, j'ai donc toute la structure principale de mon html, et où je me sert de <xsl:apply-templates select="suivant_le_contexte" />

    listecategorie.xsl et sondage.xsl doivent être affiché dans une même colonne de ma page, jusqu'ici, pas de problème.

    Mais si dans mon xml les infos relatives au sondage se trouvent avant ceux de ma liste de catégories, il apparaît t avant, et moi je ne veux pas

    Donc, je cherche un moyen de pouvoir définir l'ordre d'application de mes templates.

    Est-ce possible ?

    Merci de vos réponses.

  2. #2
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    l'ordre d'exécution des templates est l'ordre des appels.
    peux tu nous donner un exemple complet xsl et xml afi qu'on regarde mais à mon avis si tuveux qu'on appel liste catégorie avant sondage il suffit d'écrire tes appels templates catégorie avant sondage

  3. #3
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    L'attribut priority est là pour gérer les conflits entre différents templates
    Formulaires XForms sur tous navigateurs sans extension à installer (architecture XRX) : http://www.agencexml.com/xsltforms/

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Salut, et merci de vos réponses, pour ce qui concerne le priority, je ne pense pas que ce me soit nécessaire, car je n'ai pas de conflit entre mes différents templates.

    Et pour ce qui concerne l'ordre des appels, bien non, ce n'est pas lui qui est prit en compte, mais bien l'ordre établi dans mon xml.

    Je vous montre un exemple très simplifié :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <?xml-stylesheet type="text/xsl" href="page.xsl"?>
    <page>
       <titre>test application templates</titre>
       <colonne>
          <sondage>
             <question>Préférez-vous la campagne ou la ville ?</question>
             <reponse>
                <item id="1">La ville</item>
                <item id="2">La campagne</item>
             </reponse>
          </sondage>
          <categories>
             <categorie id="1">catégorie 1</categorie>
             <categorie id="2">catégorie 2</categorie>
          </categories>
       </colonne>
       <contenu>
          * Vestibulum lobortis aliquet ante.
          * Vivamus a pede eget elit accumsan congue.
          * Sed ornare imperdiet tortor.
          * Etiam id odio ut felis iaculis pulvinar.
          * Suspendisse mattis blandit quam.
          * Nam malesuada risus eget risus.
          * Donec rhoncus tristique dui.
          * In at magna id eros scelerisque interdum.
       </contenu>
    </page>

    Donc suit page.xsl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:output method="html" encoding="ISO-8859-1" doctype-public="-//W3C//DTD XHTML 1.0 Strict//E" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" />
     
    <xsl:include href="categorie.xsl" />
    <xsl:include href="sondage.xsl" />
     
    <xsl:template match="/page">
    <html>
    <body>
       <div style="margin: 0; float: left; width: 200px">
          <xsl:apply-templates select="colonne" />
       </div>
       <div style="margin: 0 0 0 200px">
          <h1><xsl:value-of select="titre" /></h1>
          <xsl:value-of select="contenu" />
       </div>
    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet>
    Là, j'appelle bien dans mes includes categorie.xsl avant sondage.xsl

    Les fichiers categorie.xsl et sondage.xsl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:template match="/page/colonne/categories">
          <ul>
             <xsl:for-each select="categorie">
                <li><a href="http://index.php?cat={@id}"><xsl:value-of select="current()" /></a></li>
             </xsl:for-each>
          </ul>
       </xsl:template>
    </xsl:stylesheet>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:template match="/page/colonne/sondage">
          <form action="" method="post">
             <p><xsl:value-of select="question" /></p>
             <xsl:for-each select="reponse/item">
                <p>
                   <label for="r{@id}"><xsl:value-of select="current()" /></label>
                   <input id="r{@id}" type="radio" name="rep" value="{@id}" />
                </p>
             </xsl:for-each>
             <p><input type="submit" value="Voter" /></p>
          </form>
       </xsl:template>
    </xsl:stylesheet>
    J'ai donc le sondage avant la liste des catégories, alors que l'appel des includes est dans le bon ordre.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Ben l'ordre des include c'est pas l'ordre des appels et ton appel est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="colonne" />
    ne spécifie aucun ordre donc prend celui du xml.
    Fait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:apply-templates select="colonne[./categories]" />
    <xsl:apply-templates select="colonne[./sondage]" />

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Oui, mais je ne peux pas faire ça, car en réalité mes includes ne se situent pas dans page.xsl, mais dans la page qui génère mon contenu, ce qui fait que dans page.xsl je ne connais pas ce qui a été inclus.

    En gros ma page principale qui s'occupe de générer la structure principale de ma page et où j'applique mes apply-templates.

    Dans mes sous-pages s'occupant de générer mon contenu qui différe donc selon les pages de mon site, j'appelle en include ma page principale, et d'autres includes pour les modules dont j'ai besoin uniquement sur ces pages.

  7. #7
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    Il me semble qu'il y a une confusion : xsl:include ne fait que charger des templates contenus dans d'autres fichiers XSLT avant le déclenchement de la transformation, qui fera appel ou pas à ces templates inclus selon le besoin, c'est tout. On peut considérer cela comme un chargement de "librairie de templates", et l'ordre d'inclusion n'a aucune importance.

    Si tu ne spécifies pas toi-même l'ordre dans lequel les templates doivent être appelés, comme Morbo te l'a indiqué, le processeur XSLT les appelera selon l'ordre d'apparition des noeuds XML correspondants dans la source.

    Dans le premier cas, on a ce qu'on appelle un mode de fonctionnement "PULL" (le code XSLT fixe l'ordre d'appel des templates, à l'aide de for-each et de apply-templates avec des select renseignés), dans l'autre un fonctionnement "PUSH" (l'ordonnancement des noeuds dans la source XML fixe l'ordre d'appel des templates, explicitement par le développeur avec des apply-templates sans select, ou implicitement par les templates par défaut). Dans la majorité des pages XSL on retrouve les deux modes de fonctionnement, selon les besoins du développeur.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  8. #8
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Ok, merci de tes explications détaillées, donc dans mon cas, je n'ai pas d'autres choix que d'ordonner mon xml selon l'ordre d'affichage désiré, il va falloir que je revois ma copie.

    Merci à vous tous de vos réponses

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XSLT] Peut-on appeler une template dans une javascript?
    Par nain-foire dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 27/10/2006, 15h41
  2. [XSLT]Contenu mixte et apply-template
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 06/10/2006, 10h24
  3. Ordre d'application de style CSS
    Par DanZzz dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 26/08/2006, 11h45
  4. [XSLT]utilisation de l'apply template
    Par koudjo dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 17/07/2006, 13h14
  5. [XSLT] Problème d'application de template
    Par kobe dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 29/06/2006, 14h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo