2016-04-21 73 views
7

我明白這個問題可能超出了撒克遜,並且更多地涉及使用它進行轉換的應用程序的體系結構,但只是想嘗試一下。請看下面的文件 -在撒克遜處理無限遞歸XSL

XML

<?xml version="1.0" encoding="UTF-8"?> 
<document> 
    string 
</document> 

XSL

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="3.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xsl xs"> 

    <xsl:template match="/"> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="node()"> 
     <xsl:apply-templates select="."/> 
    </xsl:template> 

</xsl:stylesheet> 

的XSL將進入無限循環改造又名堆棧溢出時。我的問題是 - 有沒有辦法阻止或防止這種類型的轉換進入無限遞歸?可以添加到命令行的任何可以觸發警告並正常停止的參數?

+2

我最喜歡的xslt處理器xsltproc具有:** - maxdepth值** *在libxslt斷定它處於無限循環之前,調整模板堆棧的最大深度。缺省值是500 * –

+3

您需要查看'-quit:'('on' |'off')選項,該選項確定Saxon是否退出JVM或在發生故障時引發運行時異常。如果從Java調用Saxon,後者會很有幫助。如果有一種方法可以靜態檢測無限遞歸或者阻止它,那麼計算機科學將會非常不同。 (我的意思是說:不,薩克森沒有它,因爲圖靈證明它是不可能的。) –

+2

Java虛擬機檢測到堆棧溢出,並且Saxon攔截該異常,並試圖用遞歸模板調用的方式來解釋它if它可以。但是堆棧溢出和無限遞歸併不完全相同。在這個特定的例子中,撒克遜使用一種叫做尾調用優化的技術,將遞歸轉換爲循環;這是故意設計的,可以在不耗盡可用堆棧空間的情況下實現任意深度遞歸,其結果是不會拋出堆棧溢出異常,而是永遠運行該程序。這當然是無法察覺的。 –

回答

0

您是否嘗試使用-opt:0來禁用優化?

+0

試過並沒有工作。謝謝 – Vinit