Bonjour,
> -----Original Message-----
> From: Fabrice Estiévenart [mailto:fe@cetic.be]
> Sent: mardi 22 avril 2003 11:47
> To: xml-tech@xmlfr.org
> Subject: [xml-tech] Encore une énigme XSL...
>
> Bonjour,
>
> J'aimerais transformer un document XML tel celui-ci :
> [...en] un document
> semblable à celui-ci :
> [...]
> La feuille de style suivante me donne des résultats satisfaisants mais ne
> permet pas de rassembler les éléments <E> et <F> dans le même élément
> global <element att="y"> :
> [...]
> Est-ce possible avec XSL ? Si oui, quelqu'un aurait-il une idée du code ou
> des fonctions à utiliser ? Si non, quelles sont les autres possibilités ?
> DOM ? SAX ?
Une bonne et une mauvaise nouvelle :
* la bonne : il existe une classe de transformations "qui répond à votre
question..." -- en utilisant une technique "bien connue" pour solutionner le
cœur de ce type de problème; à savoir, les regroupements de nœuds en XSLT
(ici, dans votre cas, sur la valeur de l'attribut "att") -- il s'agit de la
méthode de Steve Muench (cf. "[muenchian method]")
* la mauvaise : "qui y répond... ou presque", hélas (mais il s'en faut de
peu : je vous laisse trouver le "hic" et y réfléchir -- car cela dépend
peut-être d'une reformulation de votre besoin :)
à vous de voir, bon courage pour la suite :
-- data.xml
<?xml version="1.0" ?>
<A att="z">
<B>
<D/>
<E att="y">
<H/>
<I/>
</E>
<F att="y"/>
</B>
<C att="x">
<G/>
</C>
</A>
-- att-group.xsl
<?xml version="1.0" ?>
<xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:key name="elements-by-att" match="//*" use="@att" />
<xsl:template match="/">
<root>
<xsl:for-each select="//*[@att][count(. | key('elements-by-att', @att)[1])
= 1]">
<element att="{@att}">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</element>
</xsl:for-each>
</root>
</xsl:template>
<xsl:template match="*">
<xsl:choose>
<xsl:when test="@att">
<element ref="{@att}" />
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates
select="*[@att][count(. | key('elements-by-att', @att)[1]) != 1] |
*[not(@att)]" />
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:transform>
-- result.xml
<?xml version="1.0" ?>
<root>
<element att="z">
<A>
<B>
<D/>
<element ref="y" />
</B>
<element ref="x" />
</A>
</element>
<element att="y">
<E>
<H />
<I />
</E>
</element>
<element att="x">
<C>
<G />
</C>
</element>
</root>
> Merci d'avance pour votre aide et bravo pour ce forum très enrichissant,
(Merci pour la liste :)
> Fabrice
[muenchian method]
* http://www.jenitennison.com/xslt/grouping/muenchian.html
Cordialement,
Cyril
____________________________________________________________________________
Ce message électronique et tous les fichiers attachés qu'il contient sont
confidentiels et destinés exclusivement à l'usage de la personne à laquelle
ils sont adressés. Si vous avez reçu ce message par erreur, merci de le
retourner à son émetteur. La publication, l'usage, la distribution,
l'impression ou la copie non autorisée de ce message et des attachements
qu'il contient sont strictement interdits.
This e-mail and any files transmitted with it are confidential and intended
solely for the use of the individual to whom it is addressed. If you have
received this email in error please send it back to the person that sent it
to you. Unauthorized publication, use, dissemination, forwarding, printing
or copying of this email and its associated attachments is strictly
prohibited.
____________________________________________________________________________
--
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)
Received on Tue Apr 22 15:38:27 2003