🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fr.comp.text.xml
Article #9494

Re: [XSL] Remplacer une chaine de caracteres

#9494
From: Tom.
Date: Sat, 24 Mar 2001 21:28
80 lines
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="'&lt;&lt;'"/>
  </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="'&gt;&gt;'"/>
  </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="'&lt;&lt;'"/>
    </xsl:call-template>

  </xsl:with-param>
  <xsl:with-param name="source" select="'�'"/>
  <xsl:with-param name="dest"   select="'&gt;&gt;'"/>
</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-mail
References: <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