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 :

probleme de tri avec xsl:sort


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 28
    Par défaut probleme de tri avec xsl:sort
    Bonjour à tous,
    J'ai un soucis de trie avec mon xslt.
    Imaginons le xml suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <tailles>
    <taille nom="taille1" libelle="L"/>
    <taille nom="taille1" libelle="S"/>
    <taille nom="taille1" libelle="XS"/>
    <taille nom="taille1" libelle="M"/>
    <taille nom="taille1" libelle="XL"/>
    <taille nom="taille1" libelle="XS"/>
    </tailles>
    J'aimerai dans le xslt faire afficher ces éléments dans l'ordre.
    Je me suis imédiatement tourné vers le xsl:sort
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <xsl:for-each select="Tailles/taille">
    <xsl:sort select="@libelle" order="descending"/>
    <xsl:value-of select=@libelle/>
    </xsl:for-each>
    Mais bien évidement ca ne fonctionne pas ca me sort un truc du style :
    L-M-S-XL-XS
    au lieu de :
    XS-S-M-L-XL

    Quelqu'un aurait il une idée de génie ?

    Je vous en remercie d'avance.

    d4v1d

  2. #2
    Membre éclairé
    Inscrit en
    Mai 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 262
    Par défaut
    le XSL trie l'ordre alphabètique donc la réponse qu'il te sort est normale...

    Je ne vois qu'un test pour les tailles ou peut-être donner un nom différent ??? et trier en fonction de celui-ci...

    Moi je serai toi je donnerai un indice dans le nom du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <tailles>
    <taille nom="taille4" libelle="L"/>
    <taille nom="taille2" libelle="S"/>
    <taille nom="taille1" libelle="XS"/>
    <taille nom="taille3" libelle="M"/>
    <taille nom="taille6" libelle="XL"/>
    <taille nom="taille5" libelle="XS"/>
    </tailles>
    ou alors tu test tout tes libelles et tu les ranges comme ca...

  3. #3
    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
    je pense qu'il n'y a que cette solution
    si tu trouves autre chose je suis intéressés

  4. #4
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 28
    Par défaut
    Merci pour cette réponse,
    Je me suis intérréssé à ta 2eme proposition, mais j'ai du mal à le mettre en place.
    Nottament parce que j'ai toujours du mal avec l'incrémentation de la fonction position()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <xsl:for-each select="Tailles/taille">
      <xsl:if test="position()=1">
       <xsl:if test="Tailles/taille/@libelle=XXS">
          <xsl:value-of select=@libelle/>
       </xsl:if>
      </xsl:if>
    </xsl:for-each>
    Je ne comprend pas comment faire pour récupérer le libelle de l'occurence précédente et le comparer avec celui en cours.

    D'avance merci pour votre aide.

    d4v1d

  5. #5
    Membre éclairé Avatar de HebusBreizh
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 85
    Par défaut
    Attetion à ne pas oublier les simples cotes pour tes tests:

    <xsl:if test="tailles/taille/@libelle='XXS'">
    ...
    </xsl:if>

  6. #6
    Membre éclairé Avatar de HebusBreizh
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 85
    Par défaut
    La première solution de Little_flower est la plus facile à mettre en place: puisque tu dois trier des éléments qui ne sont pas dans l'ordre lexicographique usuel, il suffit de créer parallèlement une liste d'indirection qui elle peut être triée par la méthode de la bibliothèque <xsl:sort>.
    On obtient:
    XS -> 1
    S -> 2
    M -> 3
    L -> 4
    XL -> 5
    Mais il faut connaitre l'ensemble des tailles possibles

    Ou alors, il faut redéfinir l'ordre lexicographique... mais çà prendrait plus de temps.
    En lisant les taille à l'envers:
    On a tout d'abord: S < M < L
    Puis si il y a un X:
    - à la suite d'un S, c'est plus petit que 'S'
    - à la suite d'un L, c'est plus grand que 'L'
    Et ainsi de suite pour les 'X' qui suivent, pour obtenir en final:
    XXS < XS < S < M < L < XL < XXL

  7. #7
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 28
    Par défaut
    Bonjour merci de vos réponse
    je m'approche grace à cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:sort select="translate(@taille1,'SMLX','3451')" order="ascending"/>
    Le seul problème maintenant vient du fait que lorsque @taille1 possède un XL le translate ne prend en compte que le premier argument à savoir X et donc me met le XL toujours en première position.
    Quelqu'un aurait il une solution?
    D'avance merci
    d4v1d

  8. #8
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 28
    Par défaut
    Ok maintenant ca fonctionne et avec une seule lign svp ;-)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:sort select="translate(@axe1,'XSML',' 349')" data-type="number" order="ascending"/>
    Merci à tous pour votre aide

    d4v1d

  9. #9
    Membre éclairé Avatar de HebusBreizh
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 85
    Par défaut
    Comment fais-tu pour distinguer 'XS' de 'S' vu que les deux valeurs vaudront '3'?
    De même pour 'L' et 'XL'.
    Ca dépend de l'odre dans lequel ils sont dans le XML.
    Si tu as un 'S' avant un 'XS', il sera placé avant dans le résultat trié.

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

Discussions similaires

  1. [XSLT] tri par date avec xsl:sort
    Par Tanebisse dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 15/04/2010, 16h06
  2. Tri complexe avec xsl:sort
    Par jesemeatoutvent dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 17/01/2009, 21h53
  3. [SQL server 2005] Problème de tris avec notion Père-Fils
    Par pedrover dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/12/2006, 16h43
  4. [XSLT] Problème d'indentaion avec XSL
    Par Najdar dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 18/08/2006, 08h38
  5. [XSL] Arbres intermédiaires avec xsl:sort ?
    Par Blustuff dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 04/07/2005, 10h09

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