Xml xslt递归模板的尾部调用优化

Xml xslt递归模板的尾部调用优化,xml,xslt,nginx,tail-recursion,libxslt,Xml,Xslt,Nginx,Tail Recursion,Libxslt,背景 我们正在使用启用ngx_http_xslt_模块的nginx。这将帮助我们将样式表应用于响应。 该模块在内部使用libxslt处理器应用xslt转换。它具有可配置的递归深度(maxdepth),超过该深度将发出无限递归错误信号 问题 在3000深处,当应用于文档时,下面的xslt转换失败,出现无限递归错误,下面的xslt模板对尾部调用进行了优化,一些处理器对代码进行了优化。希望从xslt的角度确认下面的xslt函数是否真的进行了尾部优化,以及libxslt是否进行了尾部调用优化 然而,当转

背景

我们正在使用启用ngx_http_xslt_模块的nginx。这将帮助我们将样式表应用于响应。
该模块在内部使用libxslt处理器应用xslt转换。它具有可配置的递归深度(maxdepth),超过该深度将发出无限递归错误信号

问题

在3000深处,当应用于文档时,下面的xslt转换失败,出现无限递归错误,下面的xslt模板对尾部调用进行了优化,一些处理器对代码进行了优化。希望从xslt的角度确认下面的xslt函数是否真的进行了尾部优化,以及libxslt是否进行了尾部调用优化

然而,当转换为代码时,escapeQuotexslt模板不是尾部调用优化的

"currentresult" + escapeQuote(sub-string(str))
下面是用于转义双引号的xslt模板

 <xsl:template name="escapeQuote">
  <xsl:param name="pText" select="normalize-space(.)"/>
  <xsl:if test="string-length($pText) >0">
   <xsl:value-of select="substring-before(concat($pText, '&quot;'), '&quot;')"/>
   <xsl:if test="contains($pText, '&quot;')">
    <xsl:text>\"</xsl:text>
    <xsl:call-template name="escapeQuote">
      <xsl:with-param name="pText" select="substring-after($pText, '&quot;')"/>
    </xsl:call-template>
   </xsl:if>
  </xsl:if>
</xsl:template>


这在XSLT1.0中。

libxslt
不进行尾部调用优化。您应该改为使用
libxslt
中包含的EXSLT函数。
str:replace
功能在技术上不符合规范,但足以满足您的需要。具体而言(假设您正试图将
更改为
\”
):


显然,如果这样做对您更好,您可以将模板全部丢弃,只插入相关的XPath

<xsl:template xmlns:str="http://exslt.org/strings" name="escapeQuote">
  <xsl:param name="pText" select="normalize-space(.)"/>
  <xsl:value-of select="str:replace($pText,'&quot;','\&quot;')"/>
</xsl:template>