PeterK: Variable oder nicht Variable - das ist die Frage!

Hallo.

Ich hab schon ein bisschen erfahrung mit xslt, aber jetzt steh ich vor einem echten Problem:

xsl:choose
 <xsl:when test="@type='normal'">
  <xsl:variable name="typ" select="'normal'" />
 </xsl:when>
 <xsl:when test="@type='error'">
  <xsl:variable name="typ" select="'error'" />
 </xsl:when>
 <xsl:when test="@type='security'">
  <xsl:variable name="typ" select="'security'" />
 </xsl:when>
 xsl:otherwise
  <xsl:variable name="typ" select="'normal'" />
 </xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$typ" />

Egal was @typ enthält, die Variable $typ wird immer gesetzt (wegen otherwise) trotzdem meckert er: variable 'typ' not found und zwar in der Zeile mit dem value-of-Statemant. Ich würde den Typ gerne in einer Variablen Speichern, weil er mehr als einemal gebraucht wird.
Warum erkennt er die Deklaration von $typ nicht an?

Peter

--
Wer Rechtschreibfehler findet darf sie behalten.
  1. Hallo,

    Warum erkennt er die Deklaration von $typ nicht an?

    Weil wenn er (wer ist er? *g*) das Ende vom xsl:choose erreicht, alle deine Variablen ihren Geltungsbereich verloren haben. (Sie gelten nur innerhalb von xsl:choose)

    <xsl:variable name="typ">
        xsl:choose
         <xsl:when test="@type='normal'">normal</xsl:when>
         ...
        xsl:otherwise </xsl:otherwise>
       </xsl:choose>
    </xsl:variable>
    <xsl:value-of select="$typ" />

    Grüße
    Thomas

    1. Hi,

      Weil wenn er (wer ist er? *g*) das Ende vom xsl:choose erreicht, alle deine Variablen ihren Geltungsbereich verloren haben. (Sie gelten nur innerhalb von xsl:choose)

      Wirklich? Ich hätte jetzt vermutet, daß sie sogar nur innerhalb des jeweiligen when/otherwise gelten...

      cu,
      Andreas

      --
      Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
      http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
      1. Hallo Andreas,

        Weil wenn er (wer ist er? *g*) das Ende vom xsl:choose erreicht, alle deine Variablen ihren Geltungsbereich verloren haben. (Sie gelten nur innerhalb von xsl:choose)

        Wirklich? Ich hätte jetzt vermutet, daß sie sogar nur innerhalb des jeweiligen when/otherwise gelten...

        Sie gelten innerhalb des umgebenden Elements, das ist richtig. Vielleicht war ich nicht ausführlich/genau genug mit "Sie gelten nur innerhalb von xsl:choose". Was ich damit sagen wollte ist, dass wenn die Abarbeitung von xsl:choose fertig ist (d.i. wenn das letzte xsl:when bzw. das xsl:otherwise abgearbeitet wurde), die Variable $typ out of scope ist.

        Grüße
        Thomas

        1. Hi,

          Sie gelten innerhalb des umgebenden Elements, das ist richtig. Vielleicht war ich nicht ausführlich/genau genug mit "Sie gelten nur innerhalb von xsl:choose". Was ich damit sagen wollte ist, dass wenn die Abarbeitung von xsl:choose fertig ist (d.i. wenn das letzte xsl:when bzw. das xsl:otherwise abgearbeitet wurde), die Variable $typ out of scope ist.

          Ist ja im Prinzip eigentlich das selbe - die einzelnen when/otherwise schließen sich ja aus - es wird ja immer nur eines davon benutzt.
          Und außer when/otherwise darf eh nichts im choose drin sein, also wird nach dem Ende des when/otherwise auch sofort das choose beendet...

          cu,
          Andreas

          --
          Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
          http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
  2. Hi,

    xsl:choose
    <xsl:when test="@type='normal'">
      <xsl:variable name="typ" select="'normal'" />
    </xsl:when>
    <xsl:when test="@type='error'">
      <xsl:variable name="typ" select="'error'" />
    </xsl:when>
    <xsl:when test="@type='security'">
      <xsl:variable name="typ" select="'security'" />
    </xsl:when>
    xsl:otherwise
      <xsl:variable name="typ" select="'normal'" />
    </xsl:otherwise>
    </xsl:choose>
    <xsl:value-of select="$typ" />

    Egal was @typ enthält, die Variable $typ wird immer gesetzt (wegen otherwise) trotzdem meckert er: variable 'typ' not found und zwar in der Zeile mit dem value-of-Statemant. Ich würde den Typ gerne in einer Variablen Speichern, weil er mehr als einemal gebraucht wird.
    Warum erkennt er die Deklaration von $typ nicht an?

    Eine Variable existiert nur innerhalb des Blocks, in dem sie definiert wird.

    Du definierst nicht eine, sondern vier Variablen (ok, nur eine davon existiert auch tatsächlich).

    Jede deiner 4 Variablen beendet ihre Existenz direkt nach ihrer Definition, da der jeweilige Block endet.

    <xsl:variable name="typ">
     xsl:choose
       <xsl:when test="@type='normal'">normal</xsl:when> <!-- auch überflüssig, da identisch mit otherwise -->
       <xsl:when test="@type='error'">error</xsl:when>
       <xsl:when test="@type='security'">security</xsl:when>
       xsl:otherwisenormal</xsl:otherwise>
     </xsl:choose>
    </xsl:variable>
    <xsl:value-of select="$typ" />

    sollte klappen.

    Wobei, wenn sowieso nur der Text ausgegeben werden soll, die Variable komplett überflüssig ist:

    xsl:choose
       <xsl:when test="@type='error'">error</xsl:when>
       <xsl:when test="@type='security'">security</xsl:when>
       xsl:otherwisenormal</xsl:otherwise>
    </xsl:choose>

    cu,
    Andreas

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/