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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    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 confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    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.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    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 confirmé
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    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 confirmé
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    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 confirmé
    Inscrit en
    Décembre 2003
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 52
    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