Bonjour,
On jeu, 2005-04-21 at 16:10 +0200, xavier wrote:
> Bonjour,
>
> Je cherche à
> remplacer les caracteres 
 par <br> (template doReplaceCR)
> et
> remplacer les espaces par des (template doReplaceSPACE)
>
> Ceci afin de transformer un XML en HTML comprenant des retours chariots et
> des espaces non secables.
>
> Je "sais" faire les 2 remplacements mais je ne sais pas les combiner afin
> d'avoir un resultat correct.
>
> J'obtiens un resultat correct si j'appele doReplaceCR seul ou doReplaceSPACE
> seul, mais comment faire pour avoir le traitement doReplaceCR puis
> doReplaceSPACE ?
En deux mots, il suffit de mettre le résultat du premier dans une
variable et de passer cette variable au deuxième :-) ...
> Sachant qu'il m'est impoosible de stocker le resultat intermediaire (normal
> puisque c'est du HTML).
Hmmm, ce qui vient compliquer cela en XSLT 1.0, c'est la différence
entre "node sets" et "result tree
fragments" (http://xmlfr.org/documentations/faq/041013-0001).
Ceci dit, votre deuxième template (doReplaceSPACE) transforme une chaîne
de caractères en une autre chaîne de caractères et cette différence ne
s'applique donc pas pour lui.
Voici donc ce que vous pouvez faire :
>
> Le fichier essai.xml
>
> <?xml version="1.0" encoding="Windows-1252"?>
> <?xml-stylesheet type="text/xsl" href="essai.xsl"?>
> <infos>
> <essaid val="ligne1
ligne2 suite ligne
> 2
ligne3"/>
> </infos>
>
> Le fichier essai.xsl
> <?xml version="1.0" encoding="ISO-8859-1" ?>
> <!DOCTYPE xsl:stylesheet [<!ENTITY nbsp " ">]>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> <xsl:variable
> name="gReplaceCR"><xsl:text>
</xsl:text></xsl:variable>
> <xsl:variable name="gReplaceSPACE"> <xsl:text> </xsl:text></xsl:variable>
>
> <xsl:template match="/">
> <html>
> <HEAD><title>Infos</title></HEAD>
> <body >
> infos/essaid :<br/>
>
> <xsl:call-template name="doReplaceCR">
> <xsl:with-param name="text" select="infos/essaid/@val"/>
> </xsl:call-template>
Ici, il faut donc commencer par appeler doReplaceSPACE.
Vous pouvez utiliser une variable :
<xsl:variable name="replacedSpaces">
<xsl:call-template name="doReplaceSPACE">
<xsl:with-param name="text" select="infos/essaid/@val"/>
</xsl:call-template>
</xsl:variable>
et l'utiliser :
<xsl:call-template name="doReplaceCR">
<xsl:with-param name="text" select="$replacedSpaces"/>
</xsl:call-template>
ou tout faire en une seule fois :
<xsl:call-template name="doReplaceCR">
<xsl:with-param name="text">
<xsl:call-template name="doReplaceSPACE">
<xsl:with-param name="text" select="infos/essaid/@val"/>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
> </body>
> </html>
> </xsl:template>
>
> <xsl:template name="doReplaceCR">
> <xsl:param name="text"/>
> <xsl:choose>
> <xsl:when test="contains( $text, $gReplaceCR)">
> <xsl:value-of select="substring-before( $text, $gReplaceCR)"/>
> <xsl:element name="br"/>
> <xsl:call-template name="doReplaceCR"><!-- recurse -->
> <xsl:with-param name="text" select="substring-after( $text,
> $gReplaceCR)"/>
> </xsl:call-template>
> </xsl:when>
> <xsl:otherwise>
> <xsl:value-of select="$text"/>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:template>
>
> <xsl:template name="doReplaceSPACE">
> <xsl:param name="text"/>
> <xsl:choose>
> <xsl:when test="contains( $text, $gReplaceSPACE)">
> <xsl:value-of select="substring-before( $text, $gReplaceSPACE)"/>
> <xsl:text> </xsl:text>
> <xsl:call-template name="doReplaceSPACE"><!-- recurse -->
> <xsl:with-param name="text" select="substring-after( $text,
> $gReplaceSPACE)"/>
> </xsl:call-template>
> </xsl:when>
> <xsl:otherwise>
> <xsl:value-of select="$text"/>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:template>
Est-ce que votre template doReplaceSPACE ne pourrait pas être remplacé
par translate($text, " ", " ") ?
Il ne serait alors sans doute plus nécessaire d'écrire un template pour
cela et votre question serait résolue d'elle même :-) ...
Cordialement,
Eric van der Vlist
--
Weblog:
http://eric.van-der-vlist.com/blog?t=category&a=English
------------------------------------------------------------------------
Eric van der Vlist http://xmlfr.org http://dyomedea.com
(ISO) RELAX NG ISBN:0-596-00421-4 http://oreilly.com/catalog/relax
(W3C) XML Schema ISBN:0-596-00252-1 http://oreilly.com/catalog/xmlschema
------------------------------------------------------------------------
--
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)
Received on Thu Apr 21 16:28:51 2005