Pourquoi xsl:apply-templates ne garde t'il que le texte en supprimant les
éléments ?
Eric van der Vlist,
Dyomedea (vdv@dyomedea.com).
vendredi 2 février 2001
Lorsque j'applique des templates:
<xsl:apply-templates/>
le texte de mes éléments est recopié, mais pas leur
structure, pourquoi ?
Ce n'est pas xsl:apply-templates qui convertit les nœuds en
texte, mais les règles qui seront exécutées (et notamment les règles par
défaut)!
Rappelons que les règles par défaut
suivantes sont prédéfinies:
<xsl:template match="*|/">
<xsl:apply-templates/>
</xsl:template>
Cette règle applique les templates sur tous les noeuds textes
ou éléments inclus dans le noeud contexte (racine ou élément).
et
<xsl:template match="text()|@*">
<xsl:value-of select="."/>
</xsl:template>
Celle-ci copie la valeur (texte) d'un noeud texte ou attribut.
Pour voir leur influence, appliquons sur un document simple
comme celui-ci:
<?xml version="1.0" encoding="UTF-8"?>
<document>
<element>un</element>
<element>deux</element>
<element>trois</element>
</document>
une transformation "vide" :
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
</xsl:stylesheet>
Les règles par défaut permettent d'obtenir le résultat:
<?xml version="1.0" encoding="utf-8"?>
un
deux
trois
Ce sont elles qui donnent l'impression que
"apply-templates" réalise une conversion sous forme de texte.
On peut venir les "contrarier" à tout moment en
définissant d'autres règles, par exemple:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="element">
<xsl:comment>Je prend la main</xsl:comment>
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
donnera:
<?xml version="1.0" encoding="utf-8"?>
<!--Je prend la main--><element>un</element>
<!--Je prend la main--><element>deux</element>
<!--Je prend la main--><element>trois</element>
et
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="document">
<xsl:comment>Je prend la main</xsl:comment>
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
donnera:
<?xml
version="1.0" encoding="utf-8"?>
<!--Je prend la main--><document>
<element>un</element>
<element>deux</element>
<element>trois</element>
</document>
Emmanuelle
TRÉVAUX: "[xml-tech] impression d'éléments XML au moyen de XSL"Sébastien
LANDEAU: "[xml-tech] RE: [xml-tech] impression d'éléments XML au moyen de
XSL"Verachten
Bruno: "[xml-tech] RE: [xml-tech] impression d'éléments XML au moyen de
XSL"Eric
van der Vlist: "[xml-tech] Re: impression d'éléments XML au moyen de
XSL"
Copyright 2001,
Eric van der Vlist.
|