6 Stimmen

Was ist so schlimm an xsl:for-each?

Ich höre immer wieder, dass man die Verwendung von XSLT for-each vermeiden sollte. Dass es Ihr innerer Dämon der imperativen Programmierung ist, der verbannt werden sollte.

Was ist daran so schlimm?

Spielt diese bewährte Praxis eine Rolle je nach Größe von XML (d.h. 100 gegenüber 10.000 Knoten)?

6voto

Dimitre Novatchev Punkte 234995

Wesentlicher Unterschied zwischen <xsl:apply-templates> y <xsl:-for-each> auf die niemand hingewiesen hat :

  1. <xsl:apply-templates> ist wirklich mehr als nur ein schöneres, eleganteres Äquivalent von <xsl:for-each> :

xsl:apply-templates ist viel reicher und tiefer als xsl:for-each sogar einfach weil wir wissen nicht, welcher Code auf die Knoten der der Auswahl angewandt wird -- im allgemeinen Fall wird dieser Code für verschiedene verschiedene Knoten der Knoten-Liste .

Auch, den Code, der angewendet werden soll kann weit nach der Erstellung der xsl:apply-Vorlagen geschrieben werden und von Personen, die den ursprünglichen Autor nicht kennen .


_2. Auf der anderen Seite, mit <xsl:for-each> ist in keiner Weise schädlich, wenn man genau weiß, wie ein <xsl:for-each> bearbeitet wird .

Das Problem ist, dass viele XSLT-Neulinge, die Erfahrung in imperativer Programmierung haben, die <xsl:for-each> als Ersatz für eine "Schleife" in ihrem Lieblings-PL und denken, dass sie damit Unmögliches tun können - wie das Inkrementieren eines Zählers oder eine andere Änderung eines bereits definierten <xsl:variable> .

Eine unverzichtbare Verwendung von <xsl:for-each> ist es, das aktuelle Dokument zu ändern - dies ist häufig erforderlich um die Funktion key() auf ein anderes Dokument als das aktuelle Quell-XML-Dokument anwenden zu können um z. B. effizient auf eine Nachschlagetabelle zuzugreifen, die sich in einem eigenen XML-Dokument befindet.

5voto

dommer Punkte 19290

Schablonen sorgen für eine bessere Aufteilung des Codes. Außerdem leiden for-each-Schleifen unter der Tatsache, dass die Leute oft mit der Vorstellung zu ihnen kommen, dass sie genauso funktionieren wie die for-Schleifen in den großen Programmiersprachen.

2voto

Richard Punkte 103159

Schnelle Antwort: XSLT ist weitgehend funktional, und imperative Schleifen sind nicht sehr funktional.

Im Allgemeinen besteht der beste Weg, das Beste aus XSLT herauszuholen, darin, den Mustervergleich so oft wie möglich zu verwenden ( xsl:apply-template anstelle von Schleifen, ifs und Aufrufschablonen 1 ).

Letztendlich ist es eine Frage des Stils und wird bei kurzen XSLT-Stücken kaum einen Unterschied machen, aber bei längeren/komplexen Problemen wird es helfen, funktionaler zu sein.

1 Anders als bei der Erstellung von Funktionen, die Werte zurückgeben, anstatt die Ausgabe zu verändern.

2voto

Cerebrus Punkte 25410

Es ist die Verwendung eines for-each Vorlagen aufzurufen, von denen abgeraten wird, und nicht von der weit verbreiteten Verwendung von for-each per se. Auch die Münch'sche Methode der Gruppierung stützt sich auf xsl:key Konstruktionen mit xsl:for-each Schleifen.

Der Grundgedanke beim Schreiben von gutem XSLT ist, dass die Struktur Ihrer XML-Datei vorgeben sollte, welche Vorlagen abgeglichen und dann angewendet werden. Daher sollten Sie, wann immer möglich, die apply-templates um die Knoten auszuwählen, anstatt eine Auswahl mit for-each .

1voto

Stephen Denne Punkte 35003

Durch die Verwendung von apply-templates vielleicht mit einer mode macht es einfacher, geeignete Transformationen von mehr Arten von Elementen einzubeziehen, die an diesem Ort von Interesse sein könnten.

Wenn Sie z. B. XML mit dem Inhalt einer Bibliothek haben und überall for-each verwenden, um Bücher auszuwählen, und dann anfangen, DVDs, CDs, Ginger Nut Kekse usw. zu erfassen, müssen Sie alle for-each-Abschnitte überprüfen, um mehr als nur Bücher aufzunehmen. Wenn Sie apply-templates verwendet haben, können Sie vielleicht einfach die neuen Übereinstimmungen für die neuen Elemente erstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X