背景
我们正在使用启用了 ngx_http_xslt_module 的 nginx。这将有助于我们将样式表应用于响应。
该模块在内部使用 libxslt 处理器来应用 xslt 转换。它具有可配置的递归深度(最大深度),超过该深度它将发出无限递归错误的信号。
问题
在深度为 3000 时,以下 xslt 转换在应用于文档时因无限递归错误而失败。根据我所看到的其他答案,以下 xslt 模板是尾调用优化的,一些处理器优化了代码。想从 xslt 确认透视下面的 xslt 函数是否真的进行了尾部优化,以及 libxslt 是否进行了尾部调用优化。
但是,当转换为代码时,escapeQuote xslt 模板并未优化尾 调用。
"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, '"'), '"')"/>
<xsl:if test="contains($pText, '"')">
<xsl:text>\"</xsl:text>
<xsl:call-template name="escapeQuote">
<xsl:with-param name="pText" select="substring-after($pText, '"')"/>
</xsl:call-template>
</xsl:if>
</xsl:if>
</xsl:template>
这是在 XSLT 1.0 中。