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將進入無限循環改造又名堆棧溢出時。我的問題是 - 有沒有辦法阻止或防止這種類型的轉換進入無限遞歸?可以添加到命令行的任何可以觸發警告並正常停止的參數?
我最喜歡的xslt處理器xsltproc具有:** - maxdepth值** *在libxslt斷定它處於無限循環之前,調整模板堆棧的最大深度。缺省值是500 * –
您需要查看'-quit:'('on' |'off')選項,該選項確定Saxon是否退出JVM或在發生故障時引發運行時異常。如果從Java調用Saxon,後者會很有幫助。如果有一種方法可以靜態檢測無限遞歸或者阻止它,那麼計算機科學將會非常不同。 (我的意思是說:不,薩克森沒有它,因爲圖靈證明它是不可能的。) –
Java虛擬機檢測到堆棧溢出,並且Saxon攔截該異常,並試圖用遞歸模板調用的方式來解釋它if它可以。但是堆棧溢出和無限遞歸併不完全相同。在這個特定的例子中,撒克遜使用一種叫做尾調用優化的技術,將遞歸轉換爲循環;這是故意設計的,可以在不耗盡可用堆棧空間的情況下實現任意深度遞歸,其結果是不會拋出堆棧溢出異常,而是永遠運行該程序。這當然是無法察覺的。 –