Подтвердить что ты не робот

Функция замены XSLT не найдена

Я пишу XSLT-преобразование, в котором я хочу использовать функцию Replace для выполнения регулярного выражения и замены.

Однако Visual Studio 2008 сообщает, что

'replace()' - неизвестная функция XSLT.

Бит самого кода:

<xsl:otherwise>
    <td style="border: solid 1px black; background-color:#00CC66;">
          <xsl:variable name="FeatureInfo" select="Text" />
                <xsl:value-of select="replace($FeatureInfo,'Feature=','TESTING')"/>
     </td>
 </xsl:otherwise>

Есть ли что-то, что я делаю неправильно?

Спасибо:)

Изменить: Я использую эту версию XSLT, но похоже, что это версия Visual Studio - проблема... Мне нужно попытаться найти обходной путь.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
4b9b3361

Ответ 1

Функция replace доступна только в версии XSLT версии 2.0, а не в версии 1.0 которую использует Visual Studio. Просто потому, что вы указали version="2.0", это не значит, что Visual Studio поддерживает его.

Здесь находится шаблон для кодирования, который реализует замену строк в XSLT 1.0. Вы должны иметь возможность использовать его, но я не могу ручаться за его эффективность.

(Взято по ссылке выше)

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

Вы бы назвали это следующим образом:

<xsl:otherwise>
  <td style="border: solid 1px black; background-color:#00CC66;">
    <xsl:variable name="FeatureInfo" select="Text" />
    <xsl:call-template name="string-replace-all">
      <xsl:with-param name="text" select="$FeatureInfo"/>
      <xsl:with-param name="replace" select="Feature="/>
      <xsl:with-param name="by" select="TESTING"/>
    </xsl:call-template>
  </td>
</xsl:otherwise>

Ответ 2

Заменить недействительно в XSLT 1.0. У вас есть "translate()", который может сработать для вас, но replace() - это XSLT 2, а не часть базы данных MS.NET XML. Вы можете получить его с некоторыми сторонними библиотеками XML.

Ответ 3

Для простой замены строки функция перевода (доступная в xslt 1.0) отлично работала для меня.

Я использовал его для выделения пробелов для числовых значений.

Ответ 4

Как вставить С# script для замены?

Добавьте нижеследующую таблицу стилей:

<msxsl:script language="C#" implements-prefix="scr"> <![CDATA[ public string Replace(string stringToModify, string pattern, string replacement) { return stringToModify.Replace(pattern, replacement); } ]]> </msxsl:script>

Добавьте атрибут пространства имен в элемент таблицы стилей:

xmlns:scr="urn:scr.this"

Затем реализуем как....

<xsl:value-of select="scr:Replace(description/text(), 'ABC', '123')"/>

Ответ 5

вы должны поместить строку Feature = между кавычками следующим образом

<xsl:otherwise><td style="border: solid 1px black; background-color:#00CC66;">    <xsl:variable name="FeatureInfo" select="Text" />    <xsl:call-template name="string-replace-all">      <xsl:with-param name="text" select="$FeatureInfo"/>      <xsl:with-param name="replace" select="'Feature='"/>      <xsl:with-param name="by" select="TESTING"/>    </xsl:call-template>  </td></xsl:otherwise>

Thanks

Ответ 6

Насколько я знаю, replace() был представлен в XLST 2.0. Каково определение версии вашего документа? Возможно, вы должны установить VS 2008 для использования XLST 2.0 (если это возможно).