From: Dobbels Guillaume (dobbels.guillaume@sonycom.com)
Date: 14/05/2003 - 15:03
Tu me sauves la vie la... ca marche ! :-)))
Encore merci pour tout et vive MUENCH! ;-)
Guillaume
Cyril Vidal wrote:
>
> Ben oui, moi j'ai mieux et ça s'appelle toujours l'algorithme de MUENCH;-))
> Une bonne façon de faire quand on a des doutes, surtout en informatique,
> c'est de tester...
> Donc, en reprenant exactement le code que j'avais proposé dans mon dernier
> mail, et en remplaçant C par a pour être conforme au nouvel exemple demandé:
>
> fichier xml:
> <?xml version="1.0" encoding="ISO-8859-1"?>
> <source>
> <a>toto</a>
> <a>tutu</a>
> <a>tata</a>
> <a>tata</a>
> <a>tutu</a>
> <a>toto</a>
> </source>
>
> fichier xsl:
> <?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="xml"/>
> <xsl:key name="type" match="//a" use="."/>
>
> <xsl:template match="/">
> <resultat>
> <xsl:for-each select="//a[generate-id(.) = generate-id(key('type', .)
> [1])]">
> <xsl:sort select="."/>
> <a><xsl:value-of select="."/></a>
> </xsl:for-each>
> </resultat>
> </xsl:template>
>
> </xsl:stylesheet>
>
> on obtient en résultat (testé avec xalan):
> <?xml version="1.0" encoding="UTF-8"?>
> <resultat>
> <a>tata</a>
> <a>toto</a>
> <a>tutu</a>
> </resultat>
>
> et en plus classé dans l'ordre alphabétique...
>
> Si vous êtes vraiment fâché avec cette formule et qu'elle vous paraît un peu
> compliquée, vous pouvez
> toujours la simplifier en élimiant les generate-id() et utiliser à la place
> la propriété selon laquelle deux noeuds ne peuvent
> être répétés à l'intérieur d'un node set, et que donc, si deux noeuds y sont
> identiques, le node-set qui ne les contiendrait qu'eux-seuls
> devrait avoir un count =1, donc ça donne cette version de xslt:
>
> <?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="xml"/>
> <xsl:key name="type" match="//a" use="."/>
>
> <xsl:template match="/">
> <resultat>
> <xsl:for-each select="//a[count(. | key('type', .)[1]) = 1]">
> <xsl:sort select="."/>
> <a><xsl:value-of select="."/></a>
> </xsl:for-each>
> </resultat>
> </xsl:template>
>
> </xsl:stylesheet>
>
> qui donne exactement le même résultat que plus haut (testé également avec
> Xalan).
>
> La méthode avec les preceding-sibling est également possible, mais elle
> N'EST PAS
> RECOMMANDEE, EU EGARD AUX RESSOURCES QU'ELLE MOBILISE!
> La méthode de Muench est sans aucun doute préférable.
>
> Mais enfin, ultimement, c'est toujours à vous qu'il revient de décider..
>
> Cordialement,
> Cyril Vidal
> -----------------------
> web: http://www.planetexml.com
>
> ----- Original Message -----
> From: "johan JEZEQUEL" <jjezequel@aspheria.com>
> To: <xml-tech@xmlfr.org>
> Sent: Wednesday, May 14, 2003 3:38 PM
> Subject: [xml-tech] RE : Re: Eviter la repetition d'elements
>
> > Bonjour,
> > En fait le "group by" en tant que tel n'existe pas en xsl,
> > La seule solution est de passer par un preceding-sibling,
> > C'est une méthode qui va aller comparer tous (oui tous) les nouds passés
> > et le vérifier avec l'actuel.
> > Comme tu t'en doutes, cette méthode un peu bourrin (qui parcoure tout le
> > DOM à chaque noud), c'est pourquoi elle convient surtout sur les petits
> > fichiers xml (petits étant une notion subjective).
> > Mais si quelqu'un à mieux je veux bien hin!
> > Johan
> >
> > -----Message d'origine-----
> > De : xml-tech-bounce@xmlfr.org [mailto:xml-tech-bounce@xmlfr.org] De la
> > part de Dobbels Guillaume
> > Envoyé : mercredi 14 mai 2003 15:15
> > À : xml-tech@xmlfr.org
> > Objet : [xml-tech] Re: Eviter la repetition d'elements
> >
> >
> > D'accord mais ce que je designe par 'type', n'a jamais la meme valeur
> >
> > Si vous voulez, j'ai une liste d'identifiant (qui n'ont rien en commun
> > les uns des autres)
> >
> > comme:
> >
> > <a>toto</a>
> > <a>tutu</a>
> > <a>tata</a>
> > <a>tata</a>
> > <a>tutu</a>
> > <a>toto</a>
> >
> > et je veux la liste des identifiants existants
> >
> > comme:
> >
> > <a>toto</a>
> > <a>tutu</a>
> > <a>tata</a>
> >
> >
> > Je doute que l'algorithme de Muench puisse resoudre ce pb, non?
> >
> >
> > Guillaume
> >
> >
> > Cyril Vidal wrote:
> > >
> > > Bonjour,
> > >
> > > Ceci est un problème classique de regroupement, dont une des solutions
> > > peut-être l'utilisation de l'algorithme de Muench, du nom de son
> > auteur
> > > Steve Muench, basé sur xsl:key et generate-id().
> > >
> > > Pour une bonne introduction, voir notamment:
> > > http://www.jenitennison.com/xslt/grouping/muenchian.html
> > >
> > > Ici, on aura quelque chose du style:
> > >
> > > <xsl:key name="type" match="//C" use="."/>
> > > ....
> > >
> > > <xsl:for-each select="//C[generate-id(.) = generate-id(key('type', .)
> > [1])]>
> > > <row><xsl:value-of select="."/></row>
> > > </xsl:for-each>
> > > ...
> > >
> > > - l'expression key('type', .) renvoie un ensemble de noeuds de type C
> > de
> > > même contenu;
> > > - l'expression key('type', .)[1] renvoie le premier élément de cet
> > ensemble;
> > > - l'expression generate-id(key('type',.)[1]) renvoie l'identifiant de
> > ce
> > > premier élément
> > > et pour trouver tous les C qui sont en première position dans leur
> > entrée
> > > d'index, on ne prend donc que ceux pour lesquels l'identifiant donné
> > par
> > > generate-id() est égal au résultat de l'expression précédente, d'où
> > > l'expression un peu compliquée ;-)) suivante:
> > > //C[generate-id(.) = generate-id(key('type', .) [1])]
> > >
> > > Cordialement,
> > > Cyril.
> > > ----- Original Message -----
> > > From: "Dobbels Guillaume" <dobbels.guillaume@sonycom.com>
> > > To: <xml-tech@xmlfr.org>
> > > Sent: Tuesday, May 13, 2003 12:31 PM
> > > Subject: [xml-tech] Eviter la repetition d'elements
> > >
> > > >
> > > >
> > > > Bonjour,
> > > >
> > > > je vous transmets mon probleme en esperant que qq1 puisse me donner
> > la
> > > > solution:
> > > >
> > > > Voici mon fichier xml a transformer:
> > > >
> > > > <A>
> > > > <B>
> > > > <C>type1</C>
> > > > </B>
> > > > <B>
> > > > <C>type2</C>
> > > > </B>
> > > > <B>
> > > > <C>type3</C>
> > > > </B>
> > > > <B>
> > > > <C>type2</C>
> > > > </B>
> > > > <B>
> > > > <C>type1</C>
> > > > </B>
> > > > <B>
> > > > <C>type...N</C>
> > > > </B>
> > > > </A>
> > > >
> > > > Et je voudrais obtenir uniquement les types non redondants dans une
> > > > table. Tous les types existants en fait. Sans connaitre au prealable
> > les
> > > > differents types...
> > > >
> > > > -> <row>type1</row>
> > > > <row>type2</row>
> > > > <row>type3</row>
> > > > <row>type...N</row>
> > > >
> > > > Comment faire? D'avance merci!
> > > >
> > > > Guillaume
> > > > --
> > > > Devenez redacteur <XML>fr et contribuez au developpement du
> > > > xml francophone (http://xmlfr.org/infos/redacteurs/) !
> > > >
> > > > Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
> > > >
> > > > Cette liste est a votre disposition pour discuter en francais de
> > > > tout sujet technique lie a XML.
> > > >
> > > > Pour resilier votre abonnement, envoyez un message contenant
> > > > la commande "unsubscribe" a xml-tech-request@xmlfr.org
> > > > (mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
> > > >
> > > >
> > >
> > > --
> > > Devenez redacteur <XML>fr et contribuez au developpement du
> > > xml francophone (http://xmlfr.org/infos/redacteurs/) !
> > >
> > > Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
> > >
> > > Cette liste est a votre disposition pour discuter en francais de
> > > tout sujet technique lie a XML.
> > >
> > > Pour resilier votre abonnement, envoyez un message contenant
> > > la commande "unsubscribe" a xml-tech-request@xmlfr.org
> > > (mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
> > --
> > Devenez redacteur <XML>fr et contribuez au developpement du
> > xml francophone (http://xmlfr.org/infos/redacteurs/) !
> >
> > Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
> >
> > Cette liste est a votre disposition pour discuter en francais de
> > tout sujet technique lie a XML.
> >
> > Pour resilier votre abonnement, envoyez un message contenant
> > la commande "unsubscribe" a xml-tech-request@xmlfr.org
> > (mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
> >
> > -- Binary/unsupported file stripped by Ecartis --
> > -- Type: application/x-pkcs7-signature
> > -- File: smime.p7s
> >
> >
> > --
> > Devenez redacteur <XML>fr et contribuez au developpement du
> > xml francophone (http://xmlfr.org/infos/redacteurs/) !
> >
> > Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
> >
> > Cette liste est a votre disposition pour discuter en francais de
> > tout sujet technique lie a XML.
> >
> > Pour resilier votre abonnement, envoyez un message contenant
> > la commande "unsubscribe" a xml-tech-request@xmlfr.org
> > (mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
> >
> >
>
> --
> Devenez redacteur <XML>fr et contribuez au developpement du
> xml francophone (http://xmlfr.org/infos/redacteurs/) !
>
> Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
>
> Cette liste est a votre disposition pour discuter en francais de
> tout sujet technique lie a XML.
>
> Pour resilier votre abonnement, envoyez un message contenant
> la commande "unsubscribe" a xml-tech-request@xmlfr.org
> (mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
Archive générée par hypermail 2.1.3 le 28/06/2004 - 11:06 UTC
webmaster@xmlfr.org
|