web-dev-qa-db-ja.com

xslt 1.0文字列置換関数

文字列「aa :: bb :: aa」があります

「aa、bb、aa」に変換する必要があります

私が試してみました

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

しかし、これは「aa , bb , aa」を返します

どのようにこれを行うことができます。

20
Paul

非常に簡単な解決策(文字列値にスペースが含まれない限り機能します):

_translate(normalize-space(translate('aa::bb::cc',':',' ')),' ',',')
_
  1. に翻訳する " "
  2. normalize-space()は、複数の空白文字を単一のスペース ""に折りたたみます
  3. 単一のスペース ""を "、"に変換します

より堅牢なソリューションは、 再帰テンプレートを使用することです

_<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>
_

次のように使用できます:

_<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