Cyberfuzzy: Lokale Variable setzen, wenn Bedingung erfüllt ist?

Hallo,

jetzt noch eine Frage zu XSL.

Ich habe eine XSL, in der mehrere Data Elemente untereinander vorhanden sind:

<Stamm>
  <Data>Nein</Data>
  <Data>Nein</Data>
  <Data>Nein</Data>
  <Data>Ja</Data>
  <Data>Nein</Data>
</Stamm>

Wenn eines der Data Elemente den Wert "ja" enthält, soll die globale Variable abc auf 2 gesetzt werden. In diesem Beispiel müsste die Variable auf 2 gesetzt werden, weil mindestens ein Data auf Ja steht.

Wenn ich die Variable unten abfrage, steht sie aber trotzdem noch auf 1.
Anscheinend liegt das daran, dass ich keine Variable innerhalb einer for-each oder if Schleife setzen kann.

Weiß jemand, wie das funktionieren könnte?

Hier das XSL dazu:

<xsl:variable name="abc" select="'1'"/>

<xsl:template match="/">
  <xsl:for-each select="Stamm/Data">
    <xsl:if test=". = 'Ja'">
      <xsl:variable name="abc" select="'2'"/>
    </xsl:if>
  </xsl:for-each>
</xsl:template>

Danke nochmal...

Gruß
Cyberfuzzy
--
http://www.cyberfuzzy.com

  1. In XSL sind Variablen zum einen nur lokal verfügbar, sprich: nur in der gleichen Ebene und darunter, nicht jedoch in höheren Ebenen. Und zum anderen sind sie keine richtigen Variablen, denn einmal gesetzt sind sie nicht mehr veränderbar.

    Schau mal da das zweite Beispiel an, vielleicht hilft dir das etwas auf die Sprünge :-)
    http://de.selfhtml.org/xml/darstellung/xsltelemente.htm#variable

  2. Hallo,

    jetzt noch eine Frage zu XSL.

    Gut, die Antwort liegt nämlich schon im Archiv (ich weiss es, weil ich sie gegeben habe *g*)

    Wenn eines der Data Elemente den Wert "ja" enthält, soll die globale Variable abc auf 2 gesetzt werden.

    Wie mein Vorposter schon erwählte, das geht nicht. Einmal deklarierte Variablen können im XSL nicht mehr geändert werden. Dafür gibt es xsl:param.

    Wenn ich die Variable unten abfrage, steht sie aber trotzdem noch auf 1.
    Anscheinend liegt das daran, dass ich keine Variable innerhalb einer for-each oder if Schleife setzen kann.

    Doch das kannst du, aber dann hat sie ihrem Gültigkeitsbereich auch nur innerhalb des xsl:for-each

    <xsl:variable name="abc" select="'1'"/>

    Das ist eine globale Variable.

    <xsl:template match="/">
      <xsl:for-each select="Stamm/Data">
        <xsl:if test=". = 'Ja'">
          <xsl:variable name="abc" select="'2'"/>

    Und das ist eine lokale Variable, die nur innerhalb von xsl:if existiert. Wird xsl:if beendet, endet auch der Gültigkeitesbereich der Variable.

    Was du möchtest, kannst du mit einem recursiven Aufruf erledigen, suche bitte im Archiv nach counter in diesem Zusammenhang.

    Grüße
    Thomas

  3. Hi,

    <Stamm>
      <Data>Nein</Data>
      <Data>Nein</Data>
      <Data>Nein</Data>
      <Data>Ja</Data>
      <Data>Nein</Data>
    </Stamm>
    Wenn eines der Data Elemente den Wert "ja" enthält, soll die globale Variable abc auf 2 gesetzt werden. In diesem Beispiel müsste die Variable auf 2 gesetzt werden, weil mindestens ein Data auf Ja steht.

    Wie wäre es damit:

    <xsl:variable name="abc">
      xsl:choose
        <xsl:when test="count(//Data[. = 'Ja']) > 0">2</xsl:when>
        xsl:otherwise1</xsl:when>
      </xsl:choose>
    </xsl:variable>

    ungetestet, sollte aber die Variable auf 2 setzen, wenn irgendein Data existiert mit Inhalt Ja, sonst auf 1.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.