web-dev-qa-db-fra.com

fonction de remplacement de chaîne xslt 1.0

J'ai une chaîne "aa :: bb :: aa"

et vous devez le transformer en "aa, bb, aa"

J'ai essayé

translate(string,':',', ')

mais cela renvoie "aa , bb , aa"

Comment cela peut-il être fait.

20
Paul

Une solution très simple (qui fonctionnera tant que la valeur de votre chaîne n'a pas d'espace):

translate(normalize-space(translate('aa::bb::cc',':',' ')),' ',',')
  1. se traduire par " "
  2. normalize-space() pour réduire plusieurs espaces en un seul espace ""
  3. traduire les espaces simples "" en ","

Une solution plus robuste serait d'utiliser un modèle récursif :

<xsl:template name="replace-string">
    <xsl:param name="text"/>
    <xsl:param name="replace"/>
    <xsl:param name="with"/>
    <xsl:choose>
      <xsl:when test="contains($text,$replace)">
        <xsl:value-of select="substring-before($text,$replace)"/>
        <xsl:value-of select="$with"/>
        <xsl:call-template name="replace-string">
          <xsl:with-param name="text"
select="substring-after($text,$replace)"/>
          <xsl:with-param name="replace" select="$replace"/>
          <xsl:with-param name="with" select="$with"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$text"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

Vous pouvez l'utiliser comme ceci:

<xsl:call-template name="replace-string">
  <xsl:with-param name="text" select="'aa::bb::cc'"/>
  <xsl:with-param name="replace" select="'::'" />
  <xsl:with-param name="with" select="','"/>
</xsl:call-template>
68
Mads Hansen