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 :

Un Tri difficile [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre confirmé Avatar de Fredo02
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 146
    Par défaut Un Tri difficile
    Bonjour,

    J'ai besoin de trier les produits en fonction de leur sous produit le moin chère et de meme couleur.
    Le produit est lui même présent dans ses sous produits.

    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
    <produit id="16">
    	<famille>
    		<pdt id="11" prix="5" couleur="Bleu"/>
    		<pdt id="12" prix="8" couleur="Bleu"/>
    		<pdt id="13" prix="7" couleur="Bleu"/>
    		<pdt id="14" prix="9" couleur="Bleu"/>
    		<pdt id="15" prix="4" couleur="Rouge"/>
    		<pdt id="16" prix="8" couleur="Rouge"/>
    		<pdt id="17" prix="6" couleur="Rouge"/>
    	<famille>
    </produit>
    <produit id="23">
    	<famille>
    		<pdt id="21" prix="6" couleur="Rose"/>
    		<pdt id="22" prix="10" couleur="Rose"/>
    		<pdt id="23" prix="8" couleur="Rose"/>
    		<pdt id="24" prix="11" couleur="Rose"/>
    		<pdt id="25" prix="2" couleur="Vert"/>
    		<pdt id="26" prix="6" couleur="Vert"/>
    		<pdt id="27" prix="4" couleur="Vert"/>
    	<famille>
    </produit>
    J'ai fait çà, mais ce la ne semble pas fonctionner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:apply-templates select="produit">					  
    	<xsl:sort select="famille/pdt[@couleur=../pdt[@id=ancestor::produit/@id]/@couleur and not(preceding-sibling::pdt/@prix < @prix) and not(following-sibling::pdt/@prix < @prix)]/@prix" order="ascending" data-type="number" />                        
    </xsl:apply-templates>

    Avez-vous une idée ?
    Merci

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    On peut simplifier l'expression en ne vérifiant qu'aucun sibling du n'ait un prix inférieur, au lieu de vérifier preceding-sibling et following-sibling séparément. Il suffit de chercher dans ../pdt . Un élément ne va jamais être moins cher que lui-même .

    Quant à la raison pour laquelle ça ne fonctionne pas, si j'ai bien compris tu ne t'intéresses qu'au prix des produits qui ont la même couleur que le produit de l'id indiquée. Dans ce cas la vérification de l'existence de produits moins cher doit porter sur ../pdt[@couleur = ../pdt[@id = ../../@id]/@couleur] . Pas juste sur ../pdt
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Damned, thelvin m'a encore grillé !

    Sinon, pour tourner ça autrement que lui, tout en disant la même chose : tu y étais presque, tu avais simplement oublié de ne sélectionner que les frères ayant le même attribut @couleur pour comparer les prix.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:sort select="famille/pdt[@couleur=../pdt[@id=current()/@id]/@couleur and @prix &lt;= ../pdt[@couleur=../pdt[@id=current()/@id]/@couleur]/@prix]/@prix" order="ascending" data-type="number" />

  4. #4
    Membre confirmé Avatar de Fredo02
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 146
    Par défaut
    Dans ce cas, le @couleur=../pdt[@id=current()/@id]/@couleur sert encore a quelques chose ?

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ben oui... Hum... Tu sais ce que tu fais, ou tu as recopié ce truc d'ailleurs ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre confirmé Avatar de Fredo02
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 146
    Par défaut
    Etant donné que je recherche sur les frères en spécifiant la couleur, je pensais que ce critère ci ne servait plus.

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Mais... Si je ne me trompe pas, il n'y a pas que les frères, qui doivent avoir cette couleur. Le produit de plus bas prix à repérer, doit aussi avoir cette même couleur, n'est-ce pas ?
    En fait, il n'y a juste pas moyen de factoriser les deux en une seule expression XPath 1.0
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre confirmé Avatar de Fredo02
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 146
    Par défaut
    Je ne comprends pas, ça ne marche pas !!
    Le tri fait un peu n'importe quoi... il me sort 23 Euros alors que le moins cher et 3€.

    J'ai çà :

    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
    <?xml version="1.0" encoding="utf-8"?>
    <?xml-stylesheet href="pdts.xsl" type="text/xsl"?>
    <root>
      <produit id="2">
        <famille>
          <pdt id="1" couleur="BLANC" prix="4"/>
          <pdt id="2" couleur="BLANC" prix="6"/>
          <pdt id="3" couleur="ROSE" prix="23"/>
          <pdt id="4" couleur="ROSE" prix="3"/>
          </famille>
      </produit>
      <produit id="3">
        <famille>
          <pdt id="1" couleur="BLANC" prix="4"/>
          <pdt id="2" couleur="BLANC" prix="1"/>
          <pdt id="3" couleur="ROSE" prix="23"/>     
          <pdt id="4" couleur="ROSE" prix="3"/>
        </famille>
      </produit>
    </root>

    et mon 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
    <?xml version='1.0'?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:template match="root">
        <html>
          <body>
            <xsl:apply-templates select="//produit">
              <xsl:sort select="famille/pdt[@couleur=../pdt[@id=current()/@id]/@couleur and @prix &lt;= ../pdt[@couleur=../pdt[@id=current()/@id]/@couleur]/@prix]/@prix" order="ascending" data-type="number" />
            </xsl:apply-templates>
          </body>
        </html>
      </xsl:template>
      <xsl:template match="produit">    
        <span>
          <xsl:value-of select="@id"/>
          -- moins cher pour <xsl:value-of select="famille/pdt[@couleur=../pdt[@id=current()/@id]/@couleur and @prix &lt;= ../pdt[@couleur=../pdt[@id=current()/@id]/@couleur]/@prix]/@prix"/>
         </span>
        <br/>
      </xsl:template>
    </xsl:stylesheet>
    Ça devient compliqué.

  9. #9
    Membre confirmé Avatar de Fredo02
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 146
    Par défaut
    Je m'en sort avec çà mais ça me parait bourrin !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:sort select="famille/pdt[not(preceding-sibling::pdt[@couleur = ../pdt[@id=current()/@id]/@couleur]/@prix &lt;= @prix) and not(following-sibling::pdt[@couleur = ../pdt[@id=current()/@id]/@couleur]/@prix &lt; @prix) and @couleur = ../pdt[@id=current()/@id]/@couleur]/@prix" order="ascending" data-type="number" />

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hum. Elle est pas correcte, l'expression qui t'a été montrée, là.

    En voici une qui marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    famille/pdt[@couleur=../pdt[@id=current()/@id]/@couleur and not(@prix > ../pdt[@couleur=../pdt[@id=current()/@id]/@couleur]/@prix)]/@prix
    En fait, il fallait pas enlever le not(). Juste les preceding-sibling et following-sibling

    Pour ce qui est de l'affichage du prix le plus bas, on peut simplifier l'écriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:variable name="same-color" select="famille/pdt[@couleur = ../pdt[@id = current()/@id]/@couleur]" />
    <xsl:variable name="cheapest" select="$same-color[not(@prix > $same-color/@prix)]" />
    <xsl:value-of select="$cheapest/@prix"/>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre confirmé Avatar de Fredo02
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 146
    Par défaut
    Merci, çà marche nikel !!

  12. #12
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    C'est quoi la différence entre <= et not ... > ?

  13. #13
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    La même qu'entre = et not( ... != ... )

    Quand on compare deux ensembles de nœuds, ou bien un ensemble de nœuds et autre chose, le sens est :

    - prendre d'un côté l'ensemble A à gauche
    - prendre d'un autre côté l'ensemble B à droite
    - vérifier s'il existe un a appartenant à A et un b appartenant à B tels que a opérateur b est vrai.
    - si oui, l'expression est vraie. S'il n'existe rien de ce genre, l'expression est false.

    Donc, = signifie vérifier si on peut trouver deux nœuds égaux, != signifie vérifier si on peut trouver deux nœuds différents.
    Pour vérifier si on ne peut pas trouver deux nœuds égaux, il faut faire not( ... = ... )

    Pareil avec < et >=

    (Parmi les étrangetés que cela implique, l'ensemble vide n'est égal à rien et n'est différent de rien non plus. Il n'est même pas égal à lui-même.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Donc en testant si @prix <= ../pdt[@couleur=../pdt[@id=current()/@id]/@couleur]/@prix, je testais si il existait un prix supérieur ou égal au prix en cours, ce qui était vrai quelque soit l'élément.

    Je comprends mon erreur en effet.

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

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25
  3. Tri par fusion d'un tableau
    Par Mailgifson dans le forum C
    Réponses: 5
    Dernier message: 12/12/2002, 14h53
  4. [VBA-E] [Excel] Tri automatique
    Par bovi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/10/2002, 10h19
  5. [] Tri d'un tableau par ordre alphabétique
    Par cafeine dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/09/2002, 08h43

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