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 :

Recherche et tri sur des doublons XSLT


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Recherche et tri sur des doublons XSLT
    Bonjour a tous,

    Je rencontre un probleme en XSLT pour organiser un fichier XML de'une façon automatique et dynamique.
    Le fichier XML ressemnble et peut pres a ca :

    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
     
    <parent>
       <enfant>
           <val1></val1>
           <val1></val1>
       </enfant>
       <enfant>
           <val1></val1>
           <val2>1</val2>
       </enfant>
       <enfant>
           <val1></val1>
           <val2>2</val2>
       </enfant>
    ......
       <enfant>
           <val1></val1>
           <val2>1</val2>
       </enfant>
    </parent>
    Ce fichier XML peut contenir un nombre aleatoir d'enfant pouvant aller jusqu'a plus de 2000. et il faut que je regroupe tous les <enfant> selon la valeur de <val2>.
    Poue le moment, j'arrive a trier ce fichier XML avec une feuille de style XSLT mais je n'affiche qu'une seule parti du fichier (les enfant avec la valeur val2=1 ou 2 mais pas les deux en meme temps ou alors en utilisant une boucle for each, il regroupe bien les données mais le refait quand il retrouve la meme valeur de val2
    Detail du fichier XSLT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:output method="xml" media-type="text/html; charset=ISO-8859-1"/>
       <xsl:key name="enfant" match="enfant" use="val2"/>
       <xsl:template match="parent">
    	<xsl:for-each select="enfant">
    	      <xsl:sort select="val2"/>
    	      <xsl:element name="parent">
    		<xsl:copy-of select="key('enfant',val2)"/>
    	      </xsl:element>
    	</xsl:for-each>
       </xsl:template>
    </xsl:stylesheet>
    Resultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     parent
        enfant 1
     parent
        enfant 2
        enfant 2
     parent
        enfant 2
        enfant 2
    Voila, je peux donner d'autre explication si je suis pas tres clair dans mes explication et remercie par avance tout le monde de leur aide

    @++

  2. #2
    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,

    c'est un problème classique, qu'on résoud généralement à l'aide de la méthode Muench :
    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="utf-8"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
       <xsl:output method="xml" media-type="text/html; charset=ISO-8859-1"/> 
       <xsl:key name="enfant" match="enfant" use="val2"/> 
     
       <xsl:template match="parent"> 
         <xsl:for-each select="enfant/val2[generate-id(.) = generate-id(key('enfant', .)[1])]">
             <xsl:sort select="."/> 
             <xsl:element name="parent"> 
               <xsl:copy-of select="enfant[val2 = current()]"/> 
             </xsl:element> 
         </xsl:for-each> 
       </xsl:template>
     
    </xsl:stylesheet>

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Re et merci de ta réponse,

    Je viens de la tester et cela ne marche pas, apres quelques recherche de debug : generate-id(key('enfant', .)[1]) ne donne aucune valeur, donc il ne peut faire le test entre generate-id(.) et lui.
    Je vais essayer de continuer de recherhcer sur cette piste

    Merci de ton aide

  4. #4
    Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Apres quelques recherche, c'est bien la methode que je dois utilisé mais aucun résultat n'est affiché, snifff...
    la fonction key('enfant', .) ne donne aucun résulatat et donc le generate-id() ne marche pas. Si tu peux encore m'aider, j'en serait ravi car la je bloque

    Merci

  5. #5
    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
    Il semblerait que j'ai répondu un peu trop vite...

    En fait, il y a deux erreurs dans le code que j'ai donné (c'est cela quand on n'a pas le temps de tester...)

    1°) L'instruction key('enfant', .)[1] me renvoie un <enfant>, or c'est son fils <val2> dont on doit comparer l'id à celui du noeud courant.

    2°) Le select du <xsl:copy-of> n'est pas bon, il faut sélectionner les <enfant> en partant de la racine et non pas du noeud contextuel.

    Le template corrigé est celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       <xsl:template match="parent"> 
         <xsl:for-each select="enfant/val2[generate-id(.) = generate-id(key('enfant', .)[1]/val2)]"> 
             <xsl:sort select="."/> 
             <xsl:element name="parent"> 
               <xsl:copy-of select="//enfant[val2 = current()]"/> 
             </xsl:element> 
         </xsl:for-each> 
       </xsl:template>

  6. #6
    Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci cela marche tres bien, parfait

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

Discussions similaires

  1. [SQL Server 2005] DELETE sur des doublons
    Par Shakta dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 16/05/2007, 11h13
  2. Porblème de tri sur des semaines
    Par bob75000 dans le forum Access
    Réponses: 3
    Dernier message: 24/07/2006, 15h15
  3. Réponses: 3
    Dernier message: 15/06/2006, 12h03
  4. [Oracle] Tris sur des jointure externes
    Par roychris dans le forum Langage SQL
    Réponses: 6
    Dernier message: 28/04/2006, 05h25
  5. tri sur des champs calculés
    Par Thib dans le forum Bases de données
    Réponses: 10
    Dernier message: 18/10/2005, 17h24

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