From: Benoit Lefevre (lemmy4@wanadoo.fr)
Date: 27/04/2004 - 00:11
Ok.
Presente de cette facon, je comprend mieux le probleme ;)
Ceci devrait faire l'affaire alors :
--------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="ASCII" indent="yes"
media-type="xml"/>
<!-- template identite : recopie a l'identique le fichier XML
passe en entree a mois que d'autre regle de plus haute
priorite soit selectionnees a sa place -->
<xsl:template match="/ | * | @* | text() | processing-instruction() |
comment()">
<xsl:copy>
<xsl:apply-templates select="* | @* | text() | processing-instruction() |
comment()"/>
</xsl:copy>
</xsl:template>
<!-- utilise un call-template permet de traiter les noeuds
en largeur d'abord plutot qu'en profondeur d'abrod -->
<xsl:template name="levelManager">
<xsl:param name="currentLevelNodes"/>
<!-- si il y a des noeuds a ce niveau -->
<xsl:if test="$currentLevelNodes">
<!-- creer un ligne et la remplire en faisant
appel aux bon templates -->
<xsl:element name="ROW">
<xsl:apply-templates select="$currentLevelNodes"/>
</xsl:element>
<!-- Puis esseiller de creer d'autres tags ROW
avecs les noeuds du niveau suivant -->
<xsl:call-template name="levelManager">
<xsl:with-param name="currentLevelNodes" select="$currentLevelNodes/*"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- pour ne pas recopier les HEADER.COL et boucler sur les
element du 1er HD.c que l'on rencontre -->
<xsl:template match="HEADER.COL" priority="1">
<!-- quand on croise un header.col on fait simplement
appel au levelManager. C'est lui qui pour chacun
des niveau de la hierarchie va faire appel aux
bons templates -->
<xsl:call-template name="levelManager">
<xsl:with-param name="currentLevelNodes" select="*"/>
</xsl:call-template>
</xsl:template>
<!-- pour chaque HD.C correspond un tag CELL plus ou
moins grand (COLLSPAN)-->
<xsl:template match="HD.C" priority="1">
<!-- pour chaque tags HD.C, on calcule le nombre de
feuilles associes a ce noeud dans l'arbre. ce
nombre est egale au collspan -->
<xsl:variable name="leafNumber" select="count( descendant::*[
not(*) ] )"/>
<xsl:element name="CELL">
<!-- si le $leafNumber > 1 on ajoute un attribut
collspan au tag CELL nouvellement cree -->
<xsl:if test="$leafNumber > 1">
<xsl:attribute name="COLSPAN"><xsl:value-of
select="$leafNumber"/></xsl:attribute>
</xsl:if>
<!-- calcule le contenu d'un noeud CELL -->
<xsl:value-of select="normalize-space( ./text()[1] )"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
--------------------------------------------------------------
Cordialement.
Benoit Lefevre.
----- Original Message -----
From: "Olivier VEIT" <o.veit@wanadoo.fr>
To: <xml-tech@xmlfr.org>
Sent: Monday, April 26, 2004 9:59 AM
Subject: [xml-tech] RE : Re : Transformation XSLT
>
> Salut Benoit,
>
> Merci pour ton aide mais le r=E9sultat obtenu ne correspond pas au
> r=E9sultat souhait=E9 et il faudrait que la stylesheet fonctionne pour
> n'importe quel niveau d'imbrication de HD.C. Je pense que la seule
> solution est de passer par du r=E9cursif...
> Par ailleurs, la valeur de l'attribut COLSPAN est =E9galement a =
> d=E9terminer
> automatiquement par la stylesheet en fonction du nombre de fils HD.C.
>
> Voici un exemple sur 3 niveau sur lequel la conversion devrait =
> =E9galement
> fonctionner.
> FYI : HEADER.COL correspond en fait =E0 l'ent=EAte d'un tableau que je =
> doit
> transform=E9 dans un pseudo-HTML
>
> INPUT :
> =3D=3D=3D=3D=3D=3D=3D
>
> <?xml version=3D"1.0" encoding=3D"UTF-8"?>
> <TEST>
> <HEADER.COL>
> <HD.C>Mondial
> <HD.C TYPE=3D"INT">Volume
> <HD.C>kg</HD.C>
> <HD.C>tonnes</HD.C>
> </HD.C>
> <HD.C TYPE=3D"INT">Quantit=E9
> <HD.C>kg</HD.C>
> <HD.C>tonnes</HD.C> =20
> </HD.C>
> </HD.C>
> <HD.C>EEE
> <HD.C TYPE=3D"INT">Volume
> <HD.C>kg</HD.C>
> <HD.C>tonnes</HD.C>
> </HD.C>
> <HD.C TYPE=3D"INT">Quantit=E9
> <HD.C>kg</HD.C>
> <HD.C>tonnes</HD.C>
> </HD.C>
> </HD.C>
> <HD.C>Portugal
> <HD.C TYPE=3D"INT">Volume
> <HD.C>kg</HD.C>
> <HD.C>tonnes</HD.C>
> </HD.C>
> <HD.C TYPE=3D"INT">Quantit=E9
> <HD.C>kg</HD.C>
> <HD.C>tonnes</HD.C>
> </HD.C>
> </HD.C>
> </HEADER.COL>
> </TEST>
>
> Output souhait=E9 :
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
>
> <?xml version=3D"1.0" encoding=3D"ASCII"?>
> <TEST>
> <ROW>
> <CELL COLSPAN=3D"4">Mondial</CELL>
> <CELL COLSPAN=3D"4">EEE</CELL>
> <CELL COLSPAN=3D"4">Portugal</CELL>
> </ROW>
> <ROW>
> <CELL COLSPAN=3D"2">Volume</CELL>
> <CELL COLSPAN=3D"2">Quantit=E9</CELL>
> <CELL COLSPAN=3D"2">Volume</CELL>
> <CELL COLSPAN=3D"2">Quantit=E9</CELL>
> <CELL COLSPAN=3D"2">Volume</CELL>
> <CELL COLSPAN=3D"2">Quantit=E9</CELL>
> </ROW>
> <ROW>
> <CELL>kg</CELL>
> <CELL>tonnes</CELL>
> <CELL>kg</CELL>
> <CELL>tonnes</CELL>
> <CELL>kg</CELL>
> <CELL>tonnes</CELL>
> <CELL>kg</CELL>
> <CELL>tonnes</CELL>
> </ROW>
> </TEST>
>
> Si tu as une autre solution, elle est donc la bienvenue.
>
> Bonne journ=E9e
>
> @+
>
> Olivier
>
>
>
> -----Message d'origine-----
> De : xml-tech-bounce@xmlfr.org [mailto:xml-tech-bounce@xmlfr.org] De la
> part de Benoit.Lefevre@reuters.com
> Envoy=E9 : vendredi 23 avril 2004 19:20
> =C0 : xml-tech@xmlfr.org
> Objet : [xml-tech] Re : Transformation XSLT
>
>
>
>
> Salut.
>
> Est-ce que l'exemple que tu as donne correspond a ce
> que tu souhaites vraiment (il me semble que tu l'as fait a
> la va-vite car ce n'est meme pas du XML valide ;) ?
>
> Si c'est le cas, ca me semble particulierement vicieux :D
> (il ne manquerais pas un <ROW> ou deux dans le resultat
> que tu attends ?)
>
> En tous les cas, tu devrais pouvoir t'inspirer ce cette
> transformation :
>
> ---------------------------------------------
> <?xml version=3D"1.0" encoding=3D"UTF-8"?>
> <xsl:stylesheet version=3D"2.0"
> xmlns:xsl=3D"http://www.w3.org/1999/XSL/Transform">
>
> <xsl:output method=3D"xml" version=3D"1.0" encoding=3D"ASCII" =
> indent=3D"yes"
> media-type=3D"xml" />
>
> <!-- template identite : recopie a l'identique le fichier XML
> passe en entree a mois que d'autre regle de plus haute
> priorite soit selectionnees a sa place -->
> <xsl:template match=3D"/ | * | @* | text() | processing-instruction() =
> |
> comment()">
> <xsl:copy>
> <xsl:apply-templates select=3D"* | @* | text() |
> processing-instruction() | comment()"/>
> </xsl:copy>
> </xsl:template>
>
>
> <!-- pour ne pas recopier les HEADER.COL et boucler sur les
> element du 1er HD.c rencontre-->
> <xsl:template match=3D"HEADER.COL" priority=3D"1">
> <xsl:for-each select=3D"HD.C[1]/text()[1] | HD.C[1]/*">
> <xsl:variable name=3D"currentPos" select=3D"position()"/>
> <xsl:element name=3D"ROW">
> <xsl:apply-templates select=3D"."/>
> <xsl:apply-templates select=3D"../following-sibling::HD.C/(
> text()[1] | *)[$currentPos]"/>
> </xsl:element>
> </xsl:for-each>
> </xsl:template>
>
>
> <!-- pour transformer les noeuds text presents dans des noeud HD.C -->
> <xsl:template match=3D"HD.C/text()" priority=3D"1">
> <xsl:element name=3D"CELL">
> <xsl:attribute name=3D"COLSPAN">3D2</xsl:attribute>
> <xsl:value-of select=3D"normalize-space(.)"/>
> </xsl:element>
> </xsl:template>
>
>
> <!-- pour transformer les tags presents dans un noeud HD.C -->
> <xsl:template match=3D"HD.C/*" priority=3D"1">
> <xsl:element name=3D"CELL">
> <xsl:value-of select=3D"."/>
> </xsl:element>
> </xsl:template>
>
> </xsl:stylesheet>
> ---------------------------------------------
>
>
> Regarde ce que ca produit sur ton exemple ... et adapte en
> consequence ...
>
> Cordialement.
>
> Benoit Lefevre
>
>
>
> PS : elle fonctionne bien pour moi avec la derniere version
> de Saxon sur l'exemple suivant :
>
>
> ---------------------------------------------
> <?xml version=3D"1.0" encoding=3D"UTF-8"?>
> <TEST>
> <HEADER.COL>
> <HD.C>Mundial
> <HD.C TYPE=3D"3DINT">Volume 1</HD.C>
> <HD.C TYPE=3D"3DINT">Test 1</HD.C>
> </HD.C>
> <HD.C>EEE
> <HD.C TYPE=3D"3DINT">Volume 2</HD.C>
> <HD.C TYPE=3D"3DINT">Test 2</HD.C>
> </HD.C>
> <HD.C>Portugal
> <HD.C TYPE=3D"3DINT">Volume 3</HD.C>
> <HD.C TYPE=3D"3DINT">Test 3</HD.C>
> </HD.C>
> </HEADER.COL>
> </TEST>
> ---------------------------------------------
>
>
> Et produit le resultat :
>
>
> ---------------------------------------------
> <?xml version=3D"1.0" encoding=3D"ASCII"?>
> <TEST>
> <ROW>
> <CELL COLSPAN=3D"3D2">Mundial</CELL>
> <CELL COLSPAN=3D"3D2">EEE</CELL>
> <CELL COLSPAN=3D"3D2">Portugal</CELL>
> <CELL COLSPAN=3D"3D2">EEE</CELL>
> </ROW>
> <ROW>
> <CELL>Volume 1</CELL>
> <CELL>Volume 2</CELL>
> <CELL>Volume 3</CELL>
> <CELL>Volume 2</CELL>
> </ROW>
> <ROW>
> <CELL>Test 1</CELL>
> <CELL>Test 2</CELL>
> <CELL>Test 3</CELL>
> <CELL>Test 2</CELL>
> </ROW>
> </TEST>
> ---------------------------------------------
>
>
>
>
> -------------------------------------------------------------- --
> Visit our Internet site at http://www.reuters.com
>
> Get closer to the financial markets with Reuters Messaging - for more
> information and to register, visit http://www.reuters.com/messaging
>
> Any views expressed in this message are those of the individual
> sender, except where the sender specifically states them to be the
> views of Reuters Ltd.
>
> --
> 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=20
> tout sujet technique lie a XML.
>
> Pour resilier votre abonnement, envoyez un message contenant=20
> la commande "unsubscribe" a xml-tech-request@xmlfr.org
> (mailto:xml-tech-request@xmlfr.org?Subject=3Dunsubscribe)
>
> --
> 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
|