Saxon9HE错误XLM0001:嵌套的应用模板调用太多。样式表可能正在循环

时间:2013-08-02 13:38:37

标签: xslt-2.0 saxon

我正在使用Saxon9HE来转换某些XML 2.0。来自Java类;解决方案来自earlier question 我正在将双管分隔文本转换为XML 但是,某些字段包含人员的简历,并且转换会引发标题中提到的循环错误。

有没有办法解决这个问题? 我读到了增加模板堆栈中的最大深度,但这仅适用于Oxygen; Saxon9HE.jar中有类似的设置吗?

以下是代码,您也可以点击上面的链接获取代码

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes"/>

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="str">
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <xsl:analyze-string select="." regex="\|((\|\s*[^|]+\s*\|)+)\|">
      <xsl:matching-substring>
        <xsl:analyze-string select="regex-group(1)" regex="\|\s*(\w+):([^|]+?)\s*\|">
          <xsl:matching-substring>
            <xsl:element name="{regex-group(1)}">
              <xsl:value-of select="regex-group(2)"/>
            </xsl:element>
          </xsl:matching-substring>
        </xsl:analyze-string>
      </xsl:matching-substring>
      <xsl:non-matching-substring>
        <xsl:value-of select="."/>
      </xsl:non-matching-substring>
    </xsl:analyze-string>
  </xsl:copy>
</xsl:template>


</xsl:stylesheet>  

谢谢,

1 个答案:

答案 0 :(得分:2)

有两种可能性:样式表是进行无限递归,还是进行最终终止的深度递归,但需要太多的堆栈空间。

第一步是找出哪些适用,如果没有看到您的代码,我们就无法做到。

如果它是非终止递归,那么显然你的代码中的错误需要修复。

如果它是深度但有限的递归,那么通过增加可用资源可能会有一个解决方案,但这取决于你有多接近极限。作为一个实际的经验法则,不要尝试超过500级以上的递归。

有许多方法可以重写代码以避免深度递归:

(a)您可以利用Saxon的尾调优化

(b)您可以使用分而治之的递归算法代替头尾递归

(c)您可以完全避免递归,例如使用xsl:iterate或xsl:analyze-string或fold-left()函数。

但是如果没有看到你想要做什么,我们就无法进一步帮助。告诉我们代码!