Альтернатива функции replace() в XSLT 1.0

Иконка XSLT

В XSLT 2.0 есть замечательная функция replace(), которая позволяет заменить все вхождения подстроки в строке. Но что делать если вы используете XSLT версии 1.0, в котором нет этой функции?

Предлагаю решение в форме шаблона StringReplace, которая выполняет замену подстроки в строке:

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

Этот шаблон принимает следующие параметры:

input — входная строка, в которой надо произвести замену
oldValue — подстрока которую надо заменить
newValue — строка которой надо заменить все вхождения строки oldValue

В отличие от функции replace(), шаблон StringReplace выполняет обычный поиск подстроки, а не по регулярному выражению.

Далее показан пример вызова этого шаблона, где в строке с датой необходимо убрать все двоеточия:

<xsl:template match="/">
    <xsl:element name="Date">
      <xsl:call-template name="StringReplace">
        <xsl:with-param name="input" select="'2012:11:14'" />
        <xsl:with-param name="oldValue" select="':'" />
        <xsl:with-param name="newValue" select="''" />
      </xsl:call-template>
    </xsl:element>
  </xsl:template>

2 комментариев

  1. Наталья:

    Спасибо! template работает отлично.

  2. Игорь:

    Спасибо за пример. Подскажите пожалуйста решение для моего случая. Есть некий шаблон xsl который выводит таблицу с характеристиками товара. Мне нужно к каждой характеристики добавить наименование этого товара. В таблице я к каждой характеристики добавил некий текст (допустим mia) и хочу заменить его на наименование товара (допустим brend_name).
    Секция в которой хочу сделать изменения назвал как у вас Date.
    У меня проблема (помимо отсутствий знаний xsl) в том, что я не понимаю какие значения должны быть у match, и что нужно передать на вход input. Спасибо.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>