XSLT заменяет функцию в Firefox - PullRequest
0 голосов
/ 30 мая 2011

Я пытаюсь выполнить замену строки через 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 (возможно) содержит рекурсию». Ну, конечно, это так, иначе это не был бы шаблон замены строк. Другие шаблоны, собранные в сети с использованием того же стиля, также вызывают ту же проблему.

1 Ответ

2 голосов
/ 30 мая 2011

С этим документом

<content>lol</content>

эти параметры

<xsl:with-param name="text" select="lolasd"/>
<xsl:with-param name="replace" select="lol"/>
<xsl:with-param name="by" select="asd"/>

будет пустым, и поэтому это условие

<xsl:when test="contains($text,$replace)">

всегда будет верным, и ваш код будет повторяться до бесконечности.

Полагаю, вы намеревались выбрать строку вместо узла в элементах <xsl:with-param>, но вы забыли использовать кавычки / апострофы. То, что вы должны иметь, это что-то вроде

<xsl:with-param name="replace" select="'lol'"/>

Тем не менее, вы должны добавить проверку для случая, когда параметры пусты, чтобы избежать такой проблемы, если вы в конечном итоге выберете строки emtpy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...