Cliquez ici.
Accueil
 chercher             Plan du site             Info (English version) 
L'histoire de XML s'écrit en ce moment même. XMLfr vous aide à la suivre et à en dégager les tendances.Les listes de discussions XMLfr sont à votre disposition pour réagir sur nos articles ou simplement poser une question.Si vous ètes passionnée(e) par XML, pourquoi ne pas en faire votre métier ?XMLfr n'est heureusement pas le seul site où l'on parle de XML. Découvrez les autres grâce à XMLfr et à l'ODP.Les partenaires grâce auxquels XMLfr peut se développer.Pour tout savoir sur XMLfr.XMLfr sans fil, c'est possible !Pour ceux qui veulent vraiment en savoir plus sur XML.L'index du site.
 Commentaires et questions non techniques.Commentaires et questions techniques.

 
Cliquez ici.

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

 

xml tech

Discussions techniques au sujet de XML.

Cette liste est à votre disposition pour discuter en français de tout sujet technique lié à XML.



Devenez rédacteur <XML>fr et contribuez au développement du xml francophone !
Les documents publiés sur ce site le sont sous licence "Open Content"
Conception graphique
  l.henriot@online.fr  

Conception, réalisation et hébergement