Hallo Thomas,
danke für deine ausführliche Antwort.
- *RTFA(rchiv)!*
Es würde mich natürlich interessieren, wer außer dir, diese Sichtweise noch unterstützt, falls du da Quellen hast – her damit, im Archiv finde ich nichts :-)
- Begründe doch deinen Einwand. Du wirst doch Argumente dafür haben, warum es in einer for-each "schleift" und "loopt".
Absolut gerechtfertigt, werde ich gleich versuchen, aber du weißt ja, Alter vor Schönheit ;-)
Es gibt paar grundlegende Sachen, die man dazu wissen muss:
Du kannst davon ausgehen, dass ich mich mit XSLT auskenne, insbeondere auch das Funktionsmodell verstanden habe – hoffe ich zumindest ;-)
- die for-each Anweisung selektiert eine Kontenmenge
Ja – klar.
und führt _dieselbe_ Verarbeitung für jeden der Konten durch.
Keineswegs, denk an Verzweigungen. Aber das war vermutlich nur schlecht formuliert.
- for-each ist auch ein Template.
Nein, kurz und schmerzlos sage ich da – falsch. Passt auch gar nicht zu deinen nächsten Sätzen, ...
Sie instanziiert seinen Inhalt (also das Template das sie enthält) _einmal für jeden selektierten Knoten_. Der aktuell Konten (current node) ist dabei immer derjenige der gerade abgearbeitet wird.
... die ich unterschreiben kann.
- In XSLT sind Variablen nicht update-fähig. D.h. der Wert einer Variable kann nicht zur Laufzeit verändert werden.
Ja – klar.
- XSLT ist eine funktionale Sprache,
Ich würde das gerne auf einer anschaulichen Ebene diskutieren, sonst reden wir plötzlich darüber wie XSLT beispielsweise als Sprache einzuordnen ist. Wir würden dann nicht weit kommen, fürchte ich :-)
Jetzt folgen verschiedene Beispiele von dir.
<xsl:variable name="x" select="0" />
<xsl:for-each select="liste/*">
<xsl:value-of select="x + 1"/>
</xsl:for-each>
Die Ausgabe wäre immer "1", weil das Template in for-each jedes Mal neu für das aktuelle Element instantiiert wird und somit ist der Ausgangswert für "x" immer Null.
Deine Beispiele sind alle klar, wie gesagt, ich kenne mich aus.
Die nächste Iterationsrunde weiß nichts von der vorherigen.
Stimmt für dein Beispiel, ich möchte das aber allgemein nicht unterschreiben. Ich behaupte jetzt mal, die nächste Iterationsrunde, weiß sehr wohl etwas von der vorigen. Ich muss aber erst darüber nachdenken und reiche Begründung mit Beispiel nach.
Daher: es schleift und loopt nichts im for-each.
Alle deine Beispiele stützen sich nur auf das Argument, dass es in XSLT keine Variablen gibt. Hier will ich gerne einhaken und behaupten, dass Variablen keine Voraussetzung für Schleifen sind.
Will man eine "klassische Schleife" haben, greift man zur Rekursion.
Das will ich mal außen vor lassen, das ist eine gesonderte Frage, inwieweit man Rekursion mit einer Schleife vergleichen kann. Kann man, keine Frage, es geht nur darum inwieweit.
Jetzt versuche ich mal meine Sichtweise darzustellen.
Ob man for-each als Schleife gelten lassen will oder nicht, hängt letztendlich davon ab, was man als Schleife ansieht.
Man kann grundsätzlich drei Arten von Schleifen unterscheiden, Zählerschleifen, Bedingungsschleifen und Mengenschleifen. Bei for-each handelt es sich um eine Mengenschleife.
Ich habe eine geordnete Menge, hier eine Knotenliste, die current node list. Diese Menge (Knotenliste) wird in der gegebenen Reihenfolge durchlaufen, wobei bei jedem Durchlauf ein durch die Reihenfolge gegebenes Element (Knoten) zum gegenwärtigen Element (current node) wird, auf das ich unmittelbaren Zugriff habe. Ich mache doch nichts anderes, wie bei jeder Mengenschleife, als dass ich die Elemente einer Menge durchlaufe und die einzelnen Elemente dabei im gegebenen Rahmen nach Belieben manipulieren (hier bezüglich der Ausgabe) kann? Ist das keine Schleife? Ich sehe hier keinen grundsätzlichen Unterschied zu Mengenschleifen, wie sie in Programmiersprachen zur Anwendung kommen.
Übrigens, um dich vielleicht etwas zu verwirren, auch »apply-templates« ist nach dieser Definition eine Schleife. Muss dann ja auch so sein, den prinzipiell gibt es ja zwischen »apply-templates« und »for-each« keinen Unterschied.
Gruß Uwe