Article View: fr.comp.text.xml
Article #9494Re: [XSL] Remplacer une chaine de caracteres
From: Tom.
Date: Sat, 24 Mar 2001 21:28
Date: Sat, 24 Mar 2001 21:28
80 lines
3746 bytes
3746 bytes
In <m3d7b77y78.fsf@carrosse.in.glou.org>, Arnaud Gomes-do-Vale wrote:
> J'ai une feuille de style XSL qui transforme un sous-ensemble de docbk
> en LaTeX. Pour les balises, pas de probl�mes, mais je voudrais faire
> quelques transformations dans le texte (pr�fixer _ et # par \�;
> remplacer � par << et � par >>). Est-ce possible en XSL�?
Oui, mais pas tr�s facilement.
L'id�e, c'est de "d�couper" la cha�ne, prendre la partie pr�c�dant ce qu'on
veut remplacer, ajouter le "remplacement" puis la suite.
Le plus simple est de mettre en place un template nomm� qui s'appelle
r�cursivement.
<xsl:template name="remplace">
<xsd:param name="val"/>
<xsl:param name="source"/>
<xsl:param name="dest"/>
<xsl:choose>
<xsl:when test="contains($val, $source)">
<xsl:variable name="prec" select="substring-before($val, $source)"/>
<xsl:variable name="suiv" select="substring-after($val, $source)"/>
<xsl:value-of select="$prec"/>
<xsl:value-of select="$dest"/>
<xsl:call-template name="remplace">
<xsl:with-param name="val" select="$suiv"/>
<xsl:with-param name="source" select="$source"/>
<xsl:with-param name="dest" select="$dest"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$val"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Et pour l'appeler plusieurs fois de suite, on passe par des variables (il
me semble que c'est possible m�me en XSLT 1.0, avec ces histoire de
fragments de documents je suis pas s�r) :
<xsl:variable name="tmp1">
<xsl:call-template name="remplace">
<xsl:with-param name="val" select="."/>
<xsl:with-param name="source" select="'�'"/>
<xsl:with-param name="dest" select="'<<'"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="tmp2">
<xsl:call-template name="remplace">
<xsl:with-param name="val" select="$tmp1"/>
<xsl:with-param name="source" select="'�'"/>
<xsl:with-param name="dest" select="'>>'"/>
</xsl:call-template>
</xsl:variable>
ou on imbrique les appels :
<xsl:call-template name="remplace">
<xsl:with-param name="val">
<xsl:call-template name="remplace">
<xsl:with-param name="val" select="."/>
<xsl:with-param name="source" select="'�'"/>
<xsl:with-param name="dest" select="'<<'"/>
</xsl:call-template>
</xsl:with-param>
<xsl:with-param name="source" select="'�'"/>
<xsl:with-param name="dest" select="'>>'"/>
</xsl:call-template>
Tu l'auras compris, le plus simple et le plus performant est peut-�tre
encore de passer par des extensions, ou d'attendre une prochaine version de
XSLT le permettant en standard (c'est pr�vu pour XSLT 2.0, peut-�tre m�me
XSLT 1.1).
Tom.
Technical Details
Message-ID:
<Rj8v6.595$dS4.576663@nnrp5.proxad.net>Path:
arc1-ca.pugleaf.net!supernews.google.com!sn-xit-03!supernews.com!freenix!proxad.net!feeder2.proxad.net!nnrp5.proxad.net.POSTED!not-for-mailReferences:
<m3d7b77y78.fsf@carrosse.in.glou.org>Show Full Headers
Complete Article Headers
X-Google-Language: FRENCH,ASCII X-Google-Thread: 114f60,2f8c0e0a746b3a92 X-Google-Attributes: gid114f60,public X-Google-ArrivalTime: 2001-03-24 13:32:08 PST Path: arc1-ca.pugleaf.net!supernews.google.com!sn-xit-03!supernews.com!freenix!proxad.net!feeder2.proxad.net!nnrp5.proxad.net.POSTED!not-for-mail From: Tom. <ptittom+news@free.fr> Subject: Re: [XSL] Remplacer une chaine de caracteres Newsgroups: fr.comp.text.xml References: <m3d7b77y78.fsf@carrosse.in.glou.org> Lines: 80 Organization: - MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8Bit Message-ID: <Rj8v6.595$dS4.576663@nnrp5.proxad.net> Date: Sat, 24 Mar 2001 21:28:17 GMT NNTP-Posting-Host: 193.251.185.94 X-Complaints-To: abuse@proxad.net X-Trace: nnrp5.proxad.net 985469297 193.251.185.94 (Sat, 24 Mar 2001 22:28:17 CET) NNTP-Posting-Date: Sat, 24 Mar 2001 22:28:17 CET