2016-04-21 11 views
7

Capisco che questa domanda potrebbe essere al di là di Saxon e più legata all'architettura dell'applicazione che la utilizza per le trasformazioni, ma volevo solo provare. Si consideri il seguente file-Gestione della ricorsione infinita XSL in Saxon

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> 

Il XSL andrà in una ricorsione infinita durante la trasformazione aka overflow dello stack. La mia domanda è: esiste un modo per fermare o impedire che questo tipo di trasformazione entri in una ricorsione infinita? Qualsiasi parametro che può essere aggiunto alla riga di comando che può attivare un avviso e fermarsi con garbo?

+2

Il mio processore xslt preferito xsltproc ha: ** - valore maxdepth ** * Regola la profondità massima dello stack modello prima che libxslt concluda che si trova in un ciclo infinito. L'impostazione predefinita è 500 * –

+3

Si vorrà esaminare l'opzione '-quit:' ('on' |' off'), che determina se Saxon abbandona la JVM o genera un'eccezione di runtime in caso di errore. Quest'ultimo è utile se Saxon viene chiamato da Java. Se esistesse un modo per rilevare staticamente la ricorsione infinita o impedirla, l'informatica sarebbe molto diversa. (Con ciò intendo: no, Saxon non ce l'ha, perché Turing ha dimostrato che non si può avere.) –

+2

La VM Java rileva l'overflow dello stack e Saxon intercetta l'eccezione e prova a spiegarlo in termini di richiamo del modello ricorsivo se può. Ma lo stack overflow e la ricorsione infinita non sono esattamente la stessa cosa. In questo particolare esempio, Saxon utilizza una tecnica chiamata ottimizzazione chiamata coda, che converte la ricorsione in loop; questo è stato progettato deliberatamente per consentire una ricorsione arbitrariamente profonda senza esaurire lo spazio disponibile sullo stack, il che ha come conseguenza che, anziché lanciare un'eccezione di overflow dello stack, questo programma viene eseguito per sempre. Che ovviamente non è rilevabile. –

risposta

0

Hai provato -opt: 0 per disabilitare le ottimizzazioni?

+0

Provato e non ha funzionato. Grazie – Vinit

Problemi correlati