Tomson: Schleife mit XSL

Hallo,

ich habe ein Problem mit einer Schleife in XSL. Ein Template soll sich, wenn die Bedingung wahr ist, wieder selbst aufrufen.

Das ganze sieht dann im Groben so aus:

<xsl:call-template name="Schleife">
   <xsl:with-param name="Anzahl" select="count(Element)" />
</xsl:call-template>

<xsl:template name="Schleife">
<xsl:param name="Zaehler" select="1" />
<xsl:param name="Anzahl" />
<xsl:if test="$Zaehler &lt;= $Anzahl">
   <xsl:value-of select="." />xsl:text&#x9;</xsl:text>
   <xsl:call-template name="Schleife">
      <xsl:with-param name="Zaehler" select="($Zaehler)+1" />
      <xsl:with-param name="Anzahl" select="$Anzahl" />
   </xsl:call-template>
</xsl:if>
</xsl:template>

Leider erhalte ich aber dann die Meldung:
Ein Verweis auf Variable oder Parameter 'Anzahl' kann nicht gelöst werden. Die Variable bzw. der Parameter ist möglicherweise nicht definiert oder befindet sich außerhalb des Gültigkeitsbereichs.

Woran liegt denn hier der Fehler?
Wer kann helfen?

Danke schon mal!

Tomson

  1. Ich glaube du solltest hier einfach dem Parameter per default einen numerischen Wertebereich zuweisen. Ist eine Murks die erst mit xslt2.0 gelöst wurde.

    Versuch einfach mal

    <xsl:call-template name="Schleife">
       <xsl:with-param name="Anzahl" select="count(Element)" />
    </xsl:call-template>

    <xsl:template name="Schleife">
    <xsl:param name="Zaehler" select="1" />
    <xsl:param name="Anzahl" select="0" />
    <xsl:if test="$Zaehler &lt;= $Anzahl">
       <xsl:value-of select="." />xsl:text&#x9;</xsl:text>
       <xsl:call-template name="Schleife">
          <xsl:with-param name="Zaehler" select="($Zaehler)+1" />
          <xsl:with-param name="Anzahl" select="$Anzahl" />
       </xsl:call-template>
    </xsl:if>
    </xsl:template>

    Zur not test noch mit einer if abfrage zufor, ob es sich beim Paramter Zahl wirklich um eine Zahl handelt

    <xsl:if test="number($Anzahl)>
    <xsl:if test="$Zaehler &lt;= $Anzahl">
       <xsl:value-of select="." />xsl:text&#x9;</xsl:text>
       <xsl:call-template name="Schleife">
          <xsl:with-param name="Zaehler" select="($Zaehler)+1" />
          <xsl:with-param name="Anzahl" select="$Anzahl" />
       </xsl:call-template>
    </xsl:if>
    </xsl:if>

    Gruss, Holge r

    1. Hallo Holge r,

      dies hat leider alles nichts geholfen. Ich erhalte immer noch die gleiche Fehlerausschrift: "Ein Verweis auf Variable oder Parameter 'Anzahl' kann nicht gelöst werden. Die Variable bzw. der Parameter ist möglicherweise nicht definiert oder befindet sich außerhalb des Gültigkeitsbereichs."

      Ich habe das ganze jetzt mal etwas gekürzt:

      <xsl:call-template name="Schleife">
         <xsl:with-param name="Anzahl" select="count(Element)" />
      </xsl:call-template>

      <xsl:template name="Schleife">
      <xsl:param name="Anzahl" select="0" />
         <xsl:value-of select="." />xsl:text&#x9;</xsl:text>
      </xsl:template>

      So weit funktioniert das ganze ja noch. Also liegt das Problem beim nochmaligen Aufruf des Templates "Schleife".

      Hast Du noch eine Idee?

      Tomson

      1. Hallo,

        ich weiß nicht, was ich jetzt gemacht habe. Im Grunde sieht alles noch genauso aus, aber jetzt funzt es.

        Allerdings habe ich noch ein Problem mit dem Verketten von Zeichenketten:

        Mit jedem Durchlaufen der Schleife ändert sich ein Attributwert:

        Zaehler = 1    Attribut = Attribut
        Zaehler = 2    Attribut = Attribut2
        Zaehler = 3    Attribut = Attribut3
        ...

        Dies habe ich jetzt so lösen wollen:

        xsl:choose
           <xsl:when test="$Zaehler = 1">
              <xsl:value-of select="Element/[@Attribut = 'Attribut')]/@value" />
           </xsl:when>
           xsl:otherwise
              <xsl:value-of select="Element/[@Attribut = concat('Attribut',$Zaehler)]/@value" />
           </xsl:otherwise>
        </xsl:choose>

        Bei Zaehler = 1 klappt alles einwandfrei. Aber sobald der Attributwert mit dem Zaehler verkettet werden soll, erhalte ich kein Ergebnis.

        Wo liegt das Problem?

        1. Soweit mir bekannt ist:

          Element/[@Attribut = concat('Attribut',$Zaehler)]

          kein gültiger xpath, besser so

          Element[@Attribut = concat('Attribut',$Zaehler)]/@value

          oder wenn es das attribute des child element ist

          Element/*[@Attribut = concat('Attribut',$Zaehler)]/@value

          um es sauber zu machen solltest du auch noch nach string wandeln:

          Element[string(@Attribut) = concat('Attribut',string($Zaehler))]/@value

          Ansonsten muesste man dein xml und dein xsl mal sehen, woran es liegt.

          Gruss, Holge r

          1. Hallo Holge r,

            danke für Deine Hilfe.

            Element/[@Attribut = concat('Attribut',$Zaehler)]

            das war hier nur ein kleiner Tippfehler, in meinem XSL war das korrekt

            Ansonsten muesste man dein xml und dein xsl mal sehen, woran es liegt.

            Ich habe mir jetzt mal genau das XML angesehen (hätte ich vielleicht schon eher mal machen müssen). Der Attributwert enthält am Ende noch die Zeichen "&#xD;&#xA;". Dort lag das Problem ...
            Jetzt funzt alles wie gewollt.

            Also noch mal vielen Dank und viele Grüße

            Tomson