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