Hallo,
Du kannst davon ausgehen, dass ich mich mit XSLT auskenne, insbeondere auch das Funktionsmodell verstanden habe – hoffe ich zumindest ;-)
Das ist fein, das macht das Gespräch interessanter ;-)
Zuerst: in einem ganz betimmten Sinn hat du recht, man "kann" for-each als Schleife sehen, aber das muss zwangsläufig mit der Bedingung verknüpft sein, dass man sich _sehr_ genau mit dem Begriff "Schleife" und mit XSLT auskennt.
Alles andere führt in erster Linie nur zu Verwirrung und zu Fragen wie: "wie kann ich in einer for-each Schleife etwas "merken"?".
- *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 :-)
Ich bin natürlich zutiefst enttäuscht, dass ich dir nicht genüge ;-), aber ich hoffe, dass du zu Namen wie Michael Kay, Jeni Tennison oder David Carlisle mehr vertrauen hast ;-)
Nur ein Bsp: http://dpawson.co.uk/xsl/sect2/N5019.html
(ich will jetzt nicht meine Mails aus der xsl-liste durchsuchen (sind über 90Tsd, ich muss mir da was einfallen lassen)).
- 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:
und führt _dieselbe_ Verarbeitung für jeden der Konten durch.
Keineswegs, denk an Verzweigungen. Aber das war vermutlich nur schlecht formuliert.
Was meinst du genau mit Verzweigungen?
Auch wenn du darunter Bedingungen innerhalb von for-each meinst, ändert das nicht daran, dass for-each dieselbe Anweisungen für jeden der selektierten Knoten ausführt. Natürlich, mag da die eine oder andere Bedingung sein, die dann für eine andre Ausgabe einzelner Knoten sorgt, dennoch: die Anweisungen werden für jeden Knoten vom Neun ausgeführt und der Kontestknoten dabei ggf. auf die Bedingung hin überprüft.
- for-each ist auch ein Template.
Nein, kurz und schmerzlos sage ich da – falsch. Passt auch gar nicht zu deinen nächsten Sätzen, ...
Sorry, das ist absolut korrekt. Das muss ich hier nochmal betonen.
Ich habe das vielleicht nicht deutlich genung erklärt: der Inhalt von for-each ist als Template zu sehen. Dieses Template wird dann für den jeweiligen Knotexknoten instanziiert.
Siehe auch: http://www.w3.org/TR/xslt#for-each. Dies hat sich im auch in XSLT 2 nicht geändert, dort wurde "Template" lediglich durch den Begriff "sequence constructor" ersetzt.
("The term sequence constructor replaces template as used in XSLT 1.0. The change is made partly for clarity (to avoid confusion with template rules and named templates), ...")
- 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 :-)
Das stimmt, es gibt viele mögliche Bezeichnungen für XSLT: deklarative, regelbasierte, funktionale etc. Spache.
Aber so alleine stehe ich nicht mit der ansicht da:
http://www.biglist.com/lists/xsl-list/archives/200308/msg01100.html
(ich ließ die Suche in den Mails während des tippen doch laufen *g*)
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.
Das stimmt (bedingt). Will man die Position des aktuellen Knotens innerhalb der "current node list" ausgeben, geht das mit position(). Da könnte man schon annehmen, dass die Iterationsrunde "weiß" in wie wievielten Runde sie ist. Aber man kann nicht mit diesem Wissen über die Runden hinweg operieren: d.h. man kann diese Information nicht von einer Runde zur nächsten übergeben.
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.
Nein, das habe ich nicht gesagt! Was ich gesagt habe ist, dass es in XSLT keine "assignment statements" gibt. Das ist ein Unterschied!
Hier will ich gerne einhaken und behaupten, dass Variablen keine Voraussetzung für Schleifen sind.
Das muss du mir dann genauer erklären. ;-)
(falls du das jetzt nicht speziell auf for-each bezogen hast, denn dabei wäre das in jedem Fall korrekt, dass dafür Variablen keine Voraussetzung 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.
Da gebe ich dir Recht, dennoch bleibt einem, wenn man Variablen (korrekt in XSLT: Parameter) weiterreichen oder aus einer "Schleife" herausbrechen will, nichts anders übrig als auf Rekursion zurückzugreifen. Wohl nicht umsonst ist ein Prinzip für XSLT-Desing-Patterns das "don't iterate, recurse" ;-)
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.
Genau.
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?
Korrekt.
Ist das keine Schleife? Ich sehe hier keinen grundsätzlichen Unterschied zu Mengenschleifen, wie sie in Programmiersprachen zur Anwendung kommen.
Wie du sagtest: es komt darauf an, was man unter Schleife versteht.
Ü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.
*lach* dann verwirren uns jetzt gegenseitig, denn allgemein hast du zwar Recht, aber in einigen Details muss ich dir widersprechen.
Ein prinzipieller Uterschied, der nichts direkt mit apply-templats und for-each zu tun hat, liegt im "Programmierstil" bzw. in der Verarbeitung duch den Prozessor.
Die verwendung von apply-templates wird auch als "push processing" bezeichnet. Die 'lightweight' Version: der Prozessor verarbeitet ein Template und schickt es in die Welt hinaus und fragt "hat irgendein anderes Template an diesem Knoten Interesse?".
Die Verwendung von for-each wird dagegen auch als "pull processing" bezeichnet, denn anstatt die Knoten in die Welt hinauszuschicken und von einem anderen Template verarbeiten zu lassen, holt man sie "herein" und behandelt sie selbst.
Echte Unterschiede bestehen aber auch:
<xsl:for-each select="a/*"> ist unterschiedlich als <apply-templates select="a/*" />, denn im Falle von for-each werden für jedes Element in <a> dieselben Anweisungen ausgeführt, bei apply-templates kann es aber durchaus für jedes Element in <a> unterschiedliche Templates exsitieren. Aber gut, das mag jetzt nur eine Kleinigkeit sein.
Ein anderer Unterschied liegt dann vor, wenn es mehr als ein apply-templates , das auf einen selektieren Knoten zutrifft, gibt. Da spielt dann die Import-Präzedenz und die Priorität eine Rolle. Bei for-each spielt das keine Rolle, da werden die Anweisungen für den Knoten in jedem for-each ausgeführt.
...Hach die Uhrzeit! ... jetzt mache ich aber Schluß für heute!
Grüße
Thomas