IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

ersatz d'opérateur "substitute" ?


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    Points : 54
    Points
    54
    Par défaut ersatz d'opérateur "substitute" ?
    Bonjour

    je souhaite remplacer une chaine par un caractère dans un template xsl. Par exemple, je veux remplacer 'arobas' par '@' dans titi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <root>
    <titi>blabla arobas bloblo</titi>
    </root>
    Une solution serait, avec substring-before et -after, d'extraire la chaine avant 'arobas', écrire '@' et extraire la chaine après 'arobas', mais si j'ai plusieurs 'arobas' dans ma chaine, ca coince...
    Qqn a-t-il une idée?

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    la méthode proposée est bonne, il suffit juste d'ajouter la récursivité pour traiter toutes les occurences :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
      <xsl:template match="titi">
        <titi>
          <xsl:call-template name="substitute">
          	<xsl:with-param name="chaine" select="."/>
          	<xsl:with-param name="critere" select="'arobas'"/>
          	<xsl:with-param name="remplacement" select="'@'"/>      	
          </xsl:call-template>
        </titi>
      </xsl:template>
     
      <xsl:template name="substitute">
        <xsl:param name="chaine"/>
        <xsl:param name="critere"/>
        <xsl:param name="remplacement"/>
        <xsl:variable name="avant" select="substring-before($chaine, ' ')"/>
        <xsl:choose>
          <xsl:when test="$avant = $critere">
        	<xsl:value-of select="$remplacement"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="$avant"/>
          </xsl:otherwise>
        </xsl:choose>
        <xsl:variable name="apres" select="substring-after($chaine, ' ')"/>
        <xsl:if test="$apres != ''">
          <xsl:value-of select="' '"/>
          <xsl:call-template name="substitute">
          	<xsl:with-param name="chaine" select="$apres"/>
          	<xsl:with-param name="critere" select="$critere"/>
          	<xsl:with-param name="remplacement" select="$remplacement"/>      	
          </xsl:call-template>
        </xsl:if>
      </xsl:template>
    Evidemment cette fonction générique ne fonctionnera que si la chaine recherchée est séparée du reste par des espaces.

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    merci GrandFather!
    j'ai décortiqué et compris (bravo schnecke!) ce que tu proposes, mais le hic c'est que mes arobas ne sont pas tjs séparés du reste par des espaces... C'est du texte classique, les délimiteurs sont donc l'espace l'apostrophe, la virgule...
    C'est possible de définir plusieurs délimiteurs?

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    merci GrandFather!
    j'ai décortiqué et compris (bravo schnecke!) ce que tu proposes, mais le hic c'est que mes arobas ne sont pas tjs séparés du reste par des espaces... C'est du texte classique, les délimiteurs sont donc l'espace l'apostrophe, la virgule...
    C'est possible de définir plusieurs délimiteurs?

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    merci GrandFather!
    j'ai décortiqué et compris (bravo schnecke!) ce que tu proposes, mais le hic c'est que mes arobas ne sont pas tjs séparés du reste par des espaces... C'est du texte classique, les délimiteurs sont donc l'espace l'apostrophe, la virgule...
    C'est possible de définir plusieurs délimiteurs?

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    J'ai trouve ma sol, la voici donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    <xsl:template match="titi">
     <xsl:call-template name="substitute">
      <xsl:with-param name="chaine" select="."/>
      <xsl:with-param name="changer" select="'AROBAS'"/>
     </xsl:call-template>
    </xsl:template>
     
    <xsl:template name="substitute">
     <xsl:param name="chaine"/>
     <xsl:param name="changer"/>
     <xsl:variable name="avant" select="substring-before($chaine,$changer)"/>
     <xsl:variable name="apres" select="substring-after($chaine, $changer)"/>
     <xsl:value-of select="$avant"/>
     <xsl:text>@</xsl:text>
     <xsl:choose>
       <xsl:when test="contains($apres,$changer)">
       <xsl:call-template name="substitute">
        <xsl:with-param name="chaine" select="$apres"/>
        <xsl:with-param name="changer" select="$changer"/>
       </xsl:call-template>
      </xsl:when>
     
      <xsl:otherwise><xsl:value-of select="$apres"/></xsl:otherwise>
     </xsl:choose>
    </xsl:template>
    merci beaucoup pour le décoincage!

    PS comment je fais pour virer les 3 messages en doublette??? merci!

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo