Xml Firefox中的XSLT替换函数

Xml Firefox中的XSLT替换函数,xml,xslt,replace,xslt-2.0,Xml,Xslt,Replace,Xslt 2.0,我试图通过XSLT执行字符串替换,但实际上我在Firefox中看不到这种方法 当我通过以下方式使用XSLT 2.0 replace()函数时: <xsl:value-of select="replace(., 'old', 'new')"/> 我在Firefox中看到错误“调用了未知的XPath扩展函数”。 当我尝试使用任何XSLT1.0兼容的模板来执行替换时,我会得到错误“XSLT样式表(可能)包含递归”(当然,它包含递归,我看不到在XSLT中没有递归函数的情况下执行字符串替

我试图通过XSLT执行字符串替换,但实际上我在Firefox中看不到这种方法

当我通过以下方式使用XSLT 2.0 replace()函数时:

<xsl:value-of select="replace(., 'old', 'new')"/>

我在Firefox中看到错误“调用了未知的XPath扩展函数”。 当我尝试使用任何XSLT1.0兼容的模板来执行替换时,我会得到错误“XSLT样式表(可能)包含递归”(当然,它包含递归,我看不到在XSLT中没有递归函数的情况下执行字符串替换的其他方法)

因此,没有机会使用XSLT 2.0 replace()函数,也没有机会使用递归模板。如何使用XSLT执行该技巧?请不要在服务器端提出建议,我实现整个网站是为了只运行客户端转换,我不能因为一个问题就回滚,而且2011年我不能使用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样式表(可能)包含递归”。当然了,否则它就不是字符串替换模板了。网络上使用相同样式的其他模板也会引发相同的问题。

本文档

<content>lol</content>
lol
这些参数

<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 name="replace" select="'lol'"/>


尽管如此,如果最终选择了emtpy字符串,您应该为参数为空的情况添加检查以避免此类问题。

FF消息很可能意味着无限递归,这意味着存在(实际)堆栈溢出。您需要更正代码。提供您的代码(编辑问题并输入代码),或者要求使用XSLT 1.0字符串替换解决方案(XSLT标记中的各种答案中有很多这样的答案)。您也可以尝试使用Saxon CE,这是一个XSLT2.0实现,作为浏览器的一部分运行客户端。我遗憾地补充说:主要的浏览器项目何时会转移到高级XSLT2.0?整个Q将被否定..谢谢,它成功了。我不知道XSLT在字符串和节点名之间造成了这种差异,很高兴知道:)