2

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

有没有办法解决这个问题?我读到了增加模板堆栈的最大深度,但这仅适用于氧气;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>  

谢谢,

4

1 回答 1

2

有两种可能性:样式表正在执行无限递归,或者它正在执行最终会终止但需要太多堆栈空间的深度递归。

第一步是找出其中哪些适用,如果不查看您的代码,我们就无法做到这一点。

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

如果它是深度但有限的递归,那么可能会通过增加可用资源来解决,但这取决于您与极限的接近程度。作为一个实用的经验法则,不要尝试深度超过 500 层的递归。

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

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

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

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

但是,如果没有看到您正在尝试做的事情,我们将无法提供更多帮助。向我们展示代码!

于 2013-08-04T14:16:13.567 回答