Thomas: Variablenzuweisung in XSL (<xsl:variable>) mehrmals möglich?

Hallo Leute!

In einer XML-Transformation mit XSL habe ich das Problem, das sich
ein einfacher Zähler nicht realisieren läßt. Die Funktionen position(),
last() und count() sind mir bekannt, lösen aber nicht das Problem.
Folgendes einfaches Beispiel:
XML:
----
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="weg.XSL" ?>
<top>
  <eintrag>
     <bild>a</bild>
     <bild>g</bild>
     <bild>h</bild>
     <bild>a</bild>
     <bild>e</bild>
  </eintrag>
</top>
XSL:
----
<?xml version="1.0" encoding="iso-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="top/eintrag/bild">
<xsl:if test=". ='a'">
    <xsl:value-of select="." /> position <xsl:value-of select="position()" /><br/>
    <xsl:variable name="x">1</xsl:variable>
    <!-- dies geht nicht <xsl:value-of select="$x = $x + 1"/> -->
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Bei der 4 Schleifen-Iteration muß ich den Wert 2 (2 mal ist die if-bedingung erfüllt) haben, position() liefert aber
den Wert 4, die Variable-Zusweisung funktioniert nur einmal.
Wer kann mir helfen, wäre super?

Vielen Dank im voraus
Thomas

  1. Hallo Thomas,

    Bei der 4 Schleifen-Iteration muß ich den Wert 2 (2 mal ist die if-bedingung erfüllt) haben, position() liefert aber
    den Wert 4, die Variable-Zusweisung funktioniert nur einmal.

    Richtig, das ist so in XSLT, Lösung: Verwendung rekursiver Templates. Ein Beispiel dazu gibts im Archiv, aber den Link finde ich gerade nicht, da der Server ausgelastet ist. Deshalb hier ein Beispiel einer Schleifenrealisierung mit XSLT:

    <?xml version="1.0" encoding="iso-8859-1" ?>

    • <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    • <!--  aufruf der schleife
        -->
    • <xsl:template match="/">
    • <xsl:call-template name="fori">
        <xsl:with-param name="myCounter" select="0" />
        </xsl:call-template>
        </xsl:template>
    • <xsl:template name="fori">
        <xsl:param name="myCounter" />
    • <!--  hochzaehlen für naechsten durchlauf
        -->
        <xsl:variable name="mbCounter" select="$myCounter + 1" />
    • <!--  ausgabe
        -->
        <xsl:number value="$mbCounter" format="1" />
    • <xsl:if test="$mbCounter < 5">
    • <!--  bis 5
        -->
    • <!--  naechster(leider rekursiver) aufruf mit $myCounter+1
        -->
    • <xsl:call-template name="fori">
        <xsl:with-param name="myCounter" select="$mbCounter" />
        </xsl:call-template>
        </xsl:if>
        </xsl:template>
        </xsl:stylesheet>

    Gruß
    Franz