Thomas J.S.: Pfadprobleme bei When-Abfrage

Beitrag lesen

Hallo,

Rein interessehalber habe ich aber noch eine Frage:
Du hattest in einem früheren Post erwähnt, dass man for-each nicht als Schleife betrachten kann. Das ist mir nicht ganz klar.
Letztendlich passiert doch nichts anderes als bei einer Schleife.
$farbe wird z.B. bei jedem Durchlauf ein neuer Wert zugewiesen.

Man mag for-each als Schleife betrachten, dennoch ist es keine. Diese irrtümlicher Betrachtungsweise führt zu vielen "typischen" Fehler, die man eben macht, weil man denkt, man befände sich in einer Schleife.
Ganz einfacher test:
<data>
 <elem>a</elem>
 <elem>b</elem>
 <elem>c</elem>
 <elem>d</elem>
 <elem>e</elem>
</data>

<xsl:template match="/data">
<xsl:variable name="count" select="0" />
 <xsl:for-each select="elem">
  <elem>
   <xsl:value-of select="." />
   <xsl:value-of select="$count + 1" />
  </elem>
 </xsl:for-each>
</xsl:template>

"count" wird immer eins sein.
for-each iteriert nicht über die Konten, viel mehr ist for-each selbst ein Template: es werden für jeden Knoten auf die es zutrifft die Anweisungen die in ihm stehen neu ausgeführt. D.h. dieses Template wird (wie andere Templates auch) für jedes Element neu instanziiert.

Versuche beim obigen Biespiel ein: <xsl:value-of select="count(.)" /> im for-each. Das Ergebnis wird auch wieder immer 1 sein.

$farbe wird nicht bei jedem Durchlauf ein neuer Wert zugewiesen, denn der "vorige Durchlauf" weiss nichts von diesem Wert, vor allem nicht weil aus der Sicht vom for-each keinen "voriger Durchlauf" gibt. Variablen im XSLT können auch nicht geendert werden, man kann sie quasi als Konstanten betrachten.
In unserem Fall wird die Variable also für jedes Element neu erzeugt und wenn die Anweisungen im for-each alle ausgeführt sind, endet auch der Sichtbarkeitsbereich der Variable.

Ich hoffe das hilft ein wenig zum Verständnis.

Grüße
Thomas