我正在使用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>
谢谢,
答案 0 :(得分:2)
有两种可能性:样式表是进行无限递归,还是进行最终终止的深度递归,但需要太多的堆栈空间。
第一步是找出哪些适用,如果没有看到您的代码,我们就无法做到。
如果它是非终止递归,那么显然你的代码中的错误需要修复。
如果它是深度但有限的递归,那么通过增加可用资源可能会有一个解决方案,但这取决于你有多接近极限。作为一个实际的经验法则,不要尝试超过500级以上的递归。
有许多方法可以重写代码以避免深度递归:
(a)您可以利用Saxon的尾调优化
(b)您可以使用分而治之的递归算法代替头尾递归
(c)您可以完全避免递归,例如使用xsl:iterate或xsl:analyze-string或fold-left()函数。
但是如果没有看到你想要做什么,我们就无法进一步帮助。告诉我们代码!