To many nested call templates
Mark T.
- xsl
0 Thomas J.S.0 Mark T.
Hi,
ich bekommen bei Oxygen diese Meldung "to many nested call-tamplates probably looping" - bin mir relativ sicher, dass meine rekursive templates nicht loopen, da diese bei "kleineren" xml quellen funktionieren und es scheinbar tatsächlich nu daran liegt, dass einfach die templates zu oft aufgerufen werden und der parser (saxon8b9 es wohl als loop interpretiert. ich habe schon den haken bei endlosschleifenprüfung herausgenommen, aber die meldung kommt immer noch. Kann mir einer einen Tipp geben, ob man das irgendwo abstellen kann?
Die andere Sache ist, das ich dann doch wohl oder über noch mal an den xsl code heran muss, sollte es keine lösung geben. Daher eine grundlegende Frage: wann gelten die call-template als nested? Bzw. anders ausgedrückt, wann wird der zähler für die anzahl der aufrufe fuer ein bestimmtes template zurückgesetzt? Kling verworren aber ich hoffe es ist etwa verständlich. Würde mir helfen, wenn ich das Stylesheet überarbeite. for-each kann ich aus bestimmten gruenden nicht einsetzen, auch sind die xml quell-dokumente eigentlich schon sehr zerstueckelt zum besseren verarbeiten.
Habe im Google nichs gefunden, da wird zwar auch oft to many nested apply templates disuktiert aber keine Lösung vorgeschlagen, da immer davon ausgegangen wird, dass es sich um eine endlosschleife handeln muss, welche ich eigentlich bei mir relativ sicher ausschliessen kann.
Hallo,
ich bekommen bei Oxygen diese Meldung "to many nested call-tamplates probably looping" - bin mir relativ sicher, dass meine rekursive templates nicht loopen, da diese bei "kleineren" xml quellen funktionieren und es scheinbar tatsächlich nu daran liegt, dass einfach die templates zu oft aufgerufen werden und der parser (saxon8b9 es wohl als loop interpretiert. ich habe schon den haken bei endlosschleifenprüfung herausgenommen, aber die meldung kommt immer noch. Kann mir einer einen Tipp geben, ob man das irgendwo abstellen kann?
Das sollst du nicht abstellen. Saxon ist da wirklich gut, was das angeht. Es ist eher ein Zeichen dafür, dass an deinem XSL doch etwas verbessert werden sollte.
Die andere Sache ist, das ich dann doch wohl oder über noch mal an den xsl code heran muss, sollte es keine lösung geben. Daher eine grundlegende Frage: wann gelten die call-template als nested?
Wenn ein Template das von einem cal-template aufgerufen wird selbst ein call-template Funktion hat (meistens, aber nicht notwendiger weise ist das bei rekursiven Templates de Fall).
Aber sowas kann auch passieren wenn man apply-templates falsch werwendet (z.B. mit select=".", weil das sehr vom Kontext abhängt).
Bzw. anders ausgedrückt, wann wird der zähler für die anzahl der aufrufe fuer ein bestimmtes template zurückgesetzt?
Eigentlich immer wieder bzw. gar nicht. Das erste war bei der XML/XSL-Tranformatin passiert ist, dass der XSLT-Prozessor das XML- und das XSL-Dokument parst und als Baum in den Speicher legt. Dann erst wird die Transformation ausgeführt. Ein Template wird so oft aufgerufen, wie oft es Knoten gibt auf denen es zutrifft. D.h. dass das Template für jedes Konten auf dem es zutrifft nue instanziiert wird.
Das eigentliche Problem bei Rekursionen ist aber, dass es sehr vieles vom Prozessor abhängt und wie darin Rekursionen implementiert sind. Wenn man z.B. zu tief in der Rekursion steckt kann es passieren, dass das System nicht genügend speicher mehr für den Stack hat und der Prozessor die Verarbeitung abbricht. (ich denke nicht, dass es hier was bringt über 'trail-recursion' zu sprechen, weil dessesn Optimierung vom Prozessor abhängt.)
Ich würde dir empfehlen, dass du mal den XSLT-Debugger von Oxygen benutzt. Der ist wirklich sehr brauchbar, dort kannst du sowohl den Stack sehen als auch eine Verfolgung der Templates (inkl. Tiefe). Du kannst dort auch Breackpoints setzen um die Verarbeitung besser zu beobachten.
Und wie gesagt, auch ein apply-templates kann zu einer Endlosschleife führen.
Grüße
Thomas
Hallo Thomas,
vielen Dank für die Antwort, ich denke ich werde wohl doch noch einmal an den Code heranmuessen. Den Debugger nutze ich schon hi und wieder wenn es haengt, nur ist diese Auswertung hier ziemlich komplex und ich habe den Debugger nach 30 Minuten abgebrochen, nachdem er noch immer keinen Fehler gab. Ohne Debugger läuft es relativ flott in 3 Minuten durch, wird halt sehr viel neu geschrieben und wieder ausgelesen. Aber ich werde wohl noch mal mich an die Stylesheets setzen.
Trotzdem danke fuer die interessante Antwort
Grüße