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] Changer l'ordre de tri d'une liste


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 120
    Par défaut [XSLT] Changer l'ordre de tri d'une liste
    Bonjour

    J'ai un fichier XML qui comporte des elements <col> definisant en attribut : id = la position de la colonne, width = sa largeur et dont le contenu est le titre

    L'attribut "last" indique la colonne qui doit passer en dernière position
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <setting last=1>
        <col id="0" width="15">Titre1</col>
        <col id="1" width="10">Titre2</col>
        <col id="2" width="10">Titre3</col>
        <col id="3" width="8">Titre4</col>
        <col id="4" width="15">Titre5</col>
        <col id="5" width="auto">Titre6</col>
        <col id="6" width="10">Titre7</col>
        <col id="7" width="15">Titre8</col>
    </setting>
    La template suivante affiche les colonnes dans l'ordre
    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
     
       <xsl:template name="colHeader">
            <tr>
                <xsl:apply-templates select="//setting/col">
                    <xsl:sort select="@id" order="ascending" data-type="text"/>
                </xsl:apply-templates>
            </tr>
        </xsl:template>
     
        <xsl:template match="col">
                     <th>
                        <xsl:attribute name="style">
                            <xsl:text>width: </xsl:text>
                            <xsl:value-of select="@width"/>
                            <xsl:if test="number(@width)">
                                <xsl:text>%; </xsl:text>
                            </xsl:if>
                        </xsl:attribute>
                        <xsl:value-of select="."/>
                    </th>
        </xsl:template>
    Comment peut t'on changer l'ordre pour que la colonne 1 passe en dernière position
    J'ai testé plusieurs solutions :
    - avec for-each mais les paramateres ne peuvent pas être mis dans une clause conditionnelle
    - de changer les attributs id de col mais sans succés

    Une idée pour résoudre ce problème

    Merci

  2. #2
    Membre émérite
    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
    Par défaut
    dans ton sort il faut rajouter cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    data-type = "number"

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 120
    Par défaut
    Oui effectivement cela mettra dans l'ordre numérique des id de <col>
    Mais mon probléme est de changer l'ordre sans modifier l'id de <col>
    Je voudrais que la colonne dont l'id est egale à l'attribut "last" de l'élément <setting> passe en dernière position
    Le resultat serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        <tr>
          <th>Titre1</th>
          <th>Titre3</th>
          <th>Titre4</th>
          <th>Titre5</th>
          <th>Titre6</th>
          <th>Titre7</th>
          <th>Titre2</th>
        </tr>

  4. #4
    Membre Expert 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
    Par défaut
    L'avantage du tri est qu'il se fait sur une expression XPath !

    Voilà donc ce que je propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:sort select="(@id = ../@last)*1000 + @id" order="ascending" data-type="number"/>

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    Salut,

    Je suis curieux de savoir comment fonctionne cette expression : que renvoit le bout d'expression (@id = ../@last). Logiquement, ce devrait être un boolean.

    Mais dans ton cas, ca ressemble plus à un entier :
    si @id = @last => 1 * 1000 + @id
    sinon => 0 * 1000 + @id

    Si c'est ca, fallait y penser !!!

  6. #6
    Membre Expert 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
    Par défaut
    L'appel à la fonction number() pour convertir true en 1 et false en 0 est implicite, il serait plus sain de le rajouter...

    Il manque à XPath 1.0 un opérateur tel que "test ? si-vrai : si-faux"...

Discussions similaires

  1. [FAQ] [jQuery] Comment puis-je changer l'ordre des éléments d'une liste ?
    Par SylvainPV dans le forum Contributions JavaScript / AJAX
    Réponses: 3
    Dernier message: 18/03/2014, 23h44
  2. [AC-2003] Changer ordre de tri d'une requete en VBA
    Par lio33 dans le forum VBA Access
    Réponses: 0
    Dernier message: 14/12/2009, 18h01
  3. [XSLT] Changer l'ordre de tri
    Par FlyByck dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 27/11/2007, 09h37
  4. Réponses: 1
    Dernier message: 29/03/2006, 11h33
  5. Réponses: 7
    Dernier message: 20/10/2004, 08h26

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