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: MARTY Guy (Guy.Marty@sesam-vitale.fr)
Date: 21/11/2002 - 10:03


Bonjour,
Voici la transformation que j'ai écrite :
---début fichier XSLT---
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--L'objectif est de déployer les balise V du document XML auquel la
transformation est appliquée -->
<!-- Tout autre attribut ou texte ne sera pas repris dans le résultat, une
feuille vide (c'est à dire "v" vide) n'est pas recopiée en sortie -->
<!-- Idéalement, le document XML en entrée est de la forme : -->
<!--
<document v="VarDoc">
        <PremierNiveau v="VNiv1_1">
                <DeuxiemeNiveau v="VNiv2_1"/>
                <DeuxiemeNiveau v="VNiv2_2"/>
        </PremierNiveau>
        <PremierNiveau v="VNiv1_2">
                <DeuxiemeNiveau v="VNiv2_1">
                        <TroisiemeNiveau v="VNiv3_1"/>
                </DeuxiemeNiveau>
        </PremierNiveau>
</document>
-->
<!-- Ce qui donne à la sortie ceci avec une association à une CSS -->
<!--
<?xml-stylesheet type="text/css" href="FeuilleDeStyle.css"?>
<document>VarDoc<br/>
        <PremierNiveau>VNiv1_1<br/>
                <DeuxiemeNiveau>VNiv2_1<br/>
                </DeuxiemeNiveau>
                <DeuxiemeNiveau>VNiv2_2<br/>
                </DeuxiemeNiveau>
        </PremierNiveau>
        <PremierNiveau>VNiv1_2<br/>
                <DeuxiemeNiveau>VNiv2_1<br/>
                        <TroisiemeNiveau>VNiv3_1<br/>
                        </TroisiemeNiveau>
                </DeuxiemeNiveau>
        </PremierNiveau>
</document>
-->

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" version="1.0" encoding="ISO-8859-1"
indent="yes"/> <!-- Sortie XML -->

        <xsl:template match="/"> <!--Traitement de la racine XPath -->
        <!-- Inclusion appel CSS -->
        <xsl:processing-instruction name="xml-stylesheet"> type="text/css"
href=" FeuilleDeStyle.css"</xsl:processing-instruction>
                        <xsl:apply-templates select="/*"/> <!-- Appel du
noeud racine du document qui est différent de la racine XPath -->
        </xsl:template>

        <xsl:template match="/*"> <!-- Traitement du noeud racine du
document -->
                <xsl:copy>
                        <xsl:value-of select="@v"/><br/>
                        <!-- Appel du traitement de tous les fils -->
                        <xsl:apply-templates
select="child::*"><xsl:with-param name="Niveau"
select="1"/></xsl:apply-templates>
                </xsl:copy>
        </xsl:template>

        <xsl:template match="child::*"> <!-- Traitement des fils -->
                <xsl:param name="Niveau"/>
                <xsl:choose>
                        <xsl:when test="boolean(child::*) "><!-- L'élément a
des descendant ? -->
                                <xsl:variable
name="ContenuDesFils"><!--Calcul du sous arbre -->
                                        <!-- Appel du traitement de tous les
fils -->
                                        <xsl:apply-templates
select="child::*"><xsl:with-param name="Niveau" select="$Niveau +
1"/></xsl:apply-templates>
                                </xsl:variable>
                                <!--Passage à la ligne suivi du décalage
-->
                                <xsl:text>&#13;</xsl:text>
                                <xsl:call-template
name="Decaler"><xsl:with-param name="Niveau"
select="$Niveau"/></xsl:call-template>
                                <xsl:copy><!-- Recopie de la balise et de
l'attribut V -->
                                        <xsl:value-of select="@v"/><br/>
                                        <xsl:value-of
select="$ContenuDesFils"/> <!-- Restitution du contenu des fils -->
                                        <!--Passage à la ligne suivi du
décalage avant la balise de fermeture -->
                                        <xsl:text>&#13;</xsl:text>
                                        <xsl:call-template
name="Decaler"><xsl:with-param name="Niveau"
select="$Niveau"/></xsl:call-template>
                                </xsl:copy>
                        </xsl:when>
                        <xsl:otherwise><!-- Il n'y a pas de descendant -->
                                <xsl:if test="@v!='' "> <!-- L'attibut v
n'est pas vide ? -->
                                        <!--Passage à la ligne suivi du
décalage -->
                                        <xsl:text>&#13;</xsl:text>
                                        <xsl:call-template
name="Decaler"><xsl:with-param name="Niveau"
select="$Niveau"/></xsl:call-template>
                                        <xsl:copy><!-- Recopie de la balise
et de l'attribut V -->
                                                <xsl:value-of
select="@v"/><br/>
                                                <!--Passage à la ligne suivi
du décalage avant la balise de fermeture -->
                                                <xsl:text>&#13;</xsl:text>
                                                <xsl:call-template
name="Decaler"><xsl:with-param name="Niveau"
select="$Niveau"/></xsl:call-template>
                                        </xsl:copy>
                                </xsl:if>
                        </xsl:otherwise>
                </xsl:choose>
        </xsl:template>

        <xsl:template name="Decaler"><!-- Création d'un décalage -->
                <xsl:param name="Niveau"/><!--Niveau de décalage -->
                <xsl:text>&#09;</xsl:text> <!-- Décalage ici tabulation -->
                <xsl:if test="$Niveau!=1"> <!-- Le décalage de niveau a-t-il
était atteint ? -->
                        <!-- Non, donc un décalage de plus -->
                        <xsl:call-template name="Decaler"><xsl:with-param
name="Niveau" select="$Niveau - 1"/></xsl:call-template>
                </xsl:if>
        </xsl:template>

</xsl:stylesheet>
---début fichier XSLT---
Avec XMLSpy 4 associé à MSXML4 ou XALAN, il semble que xsl:copy ne
fonctionne pas, j'obtiens ainsi le résultat suivant :
----Début résultat---
<?xml-stylesheet type="text/css" href="FeuilleDeStyle.css"?>
<document>VarDoc<br/>
        <PremierNiveau>VNiv1_1<br/>
                VNiv2_1
               
                VNiv2_2
               
        </PremierNiveau>
        <PremierNiveau>VNiv1_2<br/>
                VNiv2_1
                        VNiv3_1
                       
               
        </PremierNiveau>
</document>
----Fin résultat---
Alors que quand je supprime la section : <xsl:variable
name="ContenuDesFils">(...)</xsl:variable>
et que je remplace l'appel de la variable : <xsl:value-of
select="$ContenuDesFils"/>
par le parcours des fils : <xsl:apply-templates
select="child::*"><xsl:with-param name="Niveau" select="$Niveau +
1"/></xsl:apply-templates>
j'obtiens le résultat attendu.
Cette solution n'est pas satisfaisante car je souhaite pouvoir tester la
variable " ContenuDesFils " pour ne pas créer de branches vides (celles où
il n'y a pas de noeuds avec l'attribut " v ").

Un tel comportement est-il normal ou inhérent aux processeurs XSLT (MSXML4
ou XALAN) ?
Dans le second cas, quel processeur XSLT conseilleriez-vous ?
Par avance je vous remercie pour vos réponses.
Sincères salutations
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Guy MARTY
Ingénieur normalisation - Standardisation engineer
GIE SESAM-VITALE
5, Bd A. OYON
72019 LE MANS Cedex 2
FRANCE
Tel : +33 2 43 57 42 29
Fax : +33 2 43 87 78 42
http://www.sesam-vitale.fr
Ce message n'exprime que l'opinion de son auteur.
This message only expresses its author's opinion.

--
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