From: Cyril Vidal (cyril@planetexml.com)
Date: 14/05/2003 - 14:42
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)
Archive générée par hypermail 2.1.3 le 28/06/2004 - 11:06 UTC
webmaster@xmlfr.org
|