Java junitreport:xslt在有许多换行符/换行符时使用StackOverflowerError失败

Java junitreport:xslt在有许多换行符/换行符时使用StackOverflowerError失败,java,xslt,ant,junit,Java,Xslt,Ant,Junit,我正在使用Ant1.8.2。让我们假设一个测试失败并出现stackoverflow错误 import junit.framework.TestCase; /**a failing test */ public class FailingTest extends TestCase { public void testFail() { testFail();// gives stackoverflow- result xml is now a large do

我正在使用Ant1.8.2。让我们假设一个测试失败并出现stackoverflow错误

import junit.framework.TestCase;

 /**a failing test */
 public class FailingTest    extends TestCase
 {

    public void testFail() {
        testFail();// gives stackoverflow- result xml is now a large document
    }
 }
运行junitreport将失败,出现以下错误

[junitreport]jar:file://lib/ant-junit.jar!/org/apache/tools/ant/taskdefs/optional/junit/xsl/junitframes.xsl:65:57: 致命错误!java.lang.StackOverflower错误原因: java.lang.StackOverflower错误

原因似乎是测试结果XML文件中有大量文本内容

 <testcase classname="chs.FailingTest" name="testFail" time="0.012">
      <error type="java.lang.StackOverflowError">java.lang.StackOverflowError
          at chs.FailingTest.testFail(FailingTest.java:14)
          at chs.FailingTest.testFail(FailingTest.java:14)
          at chs.FailingTest.testFail(FailingTest.java:14) ....

栈溢出
在chs.FailingTest.testFail(FailingTest.java:14)
在chs.FailingTest.testFail(FailingTest.java:14)
在chs.FailingTest.testFail(FailingTest.java:14)。。。。
我想xslt需要修剪并跳过较大的错误消息。可能的解决办法是什么

//临时修复:从结果html中跳过如此大的文本 需要在junit xslt文件中进行编辑

<xsl:template name="br-replace">
    <xsl:param name="word"/>
    <xsl:if test="string-length($word)  &lt; 31024 "> //very large size here causes stackoverflow
    <xsl:choose>
      <xsl:when test="contains($word, '&#xa;')">
        <xsl:value-of select="substring-before($word, '&#xa;')"/>
        <br/>
        <xsl:call-template name="br-replace">
          <xsl:with-param name="word" select="substring-after($word, '&#xa;')"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$word"/>
      </xsl:otherwise>
    </xsl:choose>
    </xsl:if>
</xsl:template>

//这里的尺寸过大会导致堆栈溢出

最终修复:在看到下面的答案后,我查看了ant开发站点。 SVN有新的xslt:,它将模板更新为如下所示

<xsl:template name="br-replace">
    <xsl:param name="word"/>
    <xsl:param name="br"><br/></xsl:param>
    <xsl:value-of select='stringutils:replace(string($word),"&#xA;",$br)'/>
</xsl:template>



将代码转换为XSLT 2.0:

<xsl:template name="br-replace">
    <xsl:param name="word"/>
    <xsl:for-each select="tokenize($word, '&#xa;')">
      <xsl:if test="position() != 1"><br/></xsl:if>
      <xsl:value-of select="."/>
    </xsl:for-each>
</xsl:template>


或者,使用Saxon作为XSLT处理器运行现有代码。Saxon实现了尾部调用优化,将这个递归模板转换为普通循环

   public void testFail() {
        testFail();// gives stackoverflow- result xml is now a large document
    }

此方法正在调用自身。。。。没有给出在svn中看到新br替换的线索的退出点:—使用此作为答案