Я пытаюсь выполнить замену строки через XSLT, но на самом деле я не вижу пути для этого в Firefox.
Когда я использую функцию XSLT 2.0 replace () через что-то вроде этого:
<xsl:value-of select="replace(., 'old', 'new')"/>
Я получаю в Firefox ошибку «Была вызвана неизвестная функция расширения XPath».
Когда я пытаюсь использовать любой XSLT 1.0-совместимый шаблон, который выполняет замену, я получаю сообщение об ошибке «Таблица стилей XSLT (возможно) содержит рекурсию» (конечно, она содержит рекурсию, я не вижу другого способа выполнить замену строки в XSLT без рекурсивная функция).
Таким образом, нет никаких шансов использовать функцию XSLT 2.0 replace () и нет никаких шансов использовать рекурсивный шаблон. Как мне выполнить трюк с помощью XSLT? Пожалуйста, не предлагайте сделать это на стороне сервера, я реализовал весь свой веб-сайт, чтобы выполнять преобразования только на стороне клиента, и я не могу откатиться только из-за одной проблемы, и это неправильно, что в 2011 году я не могу использовать мощная технология, такая как XSLT, из-за ее глючных и неполных реализаций.
EDIT:
Код, который я использовал, такой же, как здесь: XSLT Функция замены не найдена
Я использовал этот XML для тестирования:
<?xml version="1.0"?>
<?xml-stylesheet href="/example.xsl" type="text/xsl"?>
<content>lol</content>
и этот XSLT:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<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:template match="content">
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="lolasd"/>
<xsl:with-param name="replace" select="lol"/>
<xsl:with-param name="by" select="asd"/>
</xsl:call-template>
</xsl:template>
</xsl:stylesheet>
В Firefox я получаю «Таблица стилей XSLT (возможно) содержит рекурсию». Ну, конечно, это так, иначе это не был бы шаблон замены строк. Другие шаблоны, собранные в сети с использованием того же стиля, также вызывают ту же проблему.