Ole: Ersatz für das überschreiben von Variablen

Guten Morgen,

ich benötige in XSL eine Alternative zum überschreiben von Variablen. Mein aktueller Ansatz sieht so aus:

  
<xsl:variable name="anchor">#</xsl:variable>  
<xsl:for-each select="list/listelement">  
  <xsl:sort order="ascending" select="hersteller" />  
  <xsl:choose>  
    <xsl:when test="starts-with(translate(hersteller, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),$anchor)">  
    </xsl:when>  
    <xsl:otherwise>  
      <xsl:variable name="anchor"><xsl:value-of select="substring(hersteller,1,1)" /></xsl:variable>  
      <![CDATA[<a href="#]]><xsl:value-of select="$anchor"/><![CDATA[">]]><xsl:value-of select="$anchor"/><![CDATA[</a>]]>  
    </xsl:otherwise>  
  </xsl:choose>  
</xsl:for-each>  

Ist aus Programmierersicht eigentlich ein logischer Ansatz. Kann natürlich nicht funktionieren, da keine Variablen überschrieben werden können.

Welche Möglichkeit habe ich die gewünschte Funktionalität doch noch zu realisieren?

Danke & Gruß
Ole

--
Das Wort Vegetarier kommt aus dem Indianischen und bedeutet: Zu dumm zum Jagen.
  1. echo $begrüßung;

    ich benötige in XSL eine Alternative zum überschreiben von Variablen. Mein aktueller Ansatz sieht so aus:
    <xsl:variable name="anchor">#</xsl:variable>

    Schreib den Code zum Ermitteln des Wertes anstelle des #.

    echo "$verabschiedung $name";

    1. Guten Morgen,

      Schreib den Code zum Ermitteln des Wertes anstelle des #.

      Ich kann dir grad nicht folgen. Stehe ziemlich auf dem Schlauch. Wie meinst du das?

      Danke & Gruß
      Ole

      --
      Das Wort Vegetarier kommt aus dem Indianischen und bedeutet: Zu dumm zum Jagen.
      1. echo $begrüßung;

        » Schreib den Code zum Ermitteln des Wertes anstelle des #.
        Ich kann dir grad nicht folgen. Stehe ziemlich auf dem Schlauch. Wie meinst du das?

        Zwischen <xsl:variable name="foo"> und </xsl:variable> darf nicht nur ein Wert stehen. Dort können auch andere XSL-Elemente notiert sein. Siehe SELFHTML-Beispiel zu http://de.selfhtml.org/xml/darstellung/xsltelemente.htm#variable@title=xsl:variable.

        echo "$verabschiedung $name";

      2. Hallo,

        »» Schreib den Code zum Ermitteln des Wertes anstelle des #.

        Ich kann dir grad nicht folgen. Stehe ziemlich auf dem Schlauch. Wie meinst du das?

        <xsl:for-each select="list/listelement">
          <xsl:sort order="ascending" select="hersteller" />
        <xsl:variable name="anchor">
          xsl:choose
            <xsl:when test="starts-with(translate(hersteller, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),'#')">
            </xsl:when>
            xsl:otherwise
              <xsl:variable name="anchor"><xsl:value-of select="substring(hersteller,1,1)" /></xsl:variable>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:variable>
        <![CDATA[<a href="#]]><xsl:value-of select="$anchor"/><![CDATA[">]]><xsl:value-of select="$anchor"/><![CDATA[</a>]]>
        </xsl:for-each>

        Grüße
        Thomas

        1. Hallo Thomas,

          hier wird ja jedes mal gegen "#" geprüft. Die Variable soll jedoch immer mit dem Wert verglichen werden, der beim vorhergehenden "Durchlauf" in dieser gespeichert wurde.

          Ich steh total auf dem Schlauch :(

          Danke & Gruß
          Ole

          --
          Das Wort Vegetarier kommt aus dem Indianischen und bedeutet: Zu dumm zum Jagen.
          1. Hallo,

            hier wird ja jedes mal gegen "#" geprüft. Die Variable soll jedoch immer mit dem Wert verglichen werden, der beim vorhergehenden "Durchlauf" in dieser gespeichert wurde.

            Sicher?
            Das scheint für mich nicht sehr viel Sinn zu ergeben.

            Schreibe einfach ein Template in dem du immer auf den entsprechenden Wert vom preceding-sibling zugreifst (oder fall kein solcher, nimmst du eben '#'). Dann dort wo du die ausgabe haben willst ein apply-templates machen und darin noch die Sortierung angeben.

            Falls das immer noch nicht das ist was du möchtest, verstehe ich nicht, was du erreichen willst (mir ist das mit CDATA eh suspekt).
            Das "Variable überschreiben" muss ja nicht unbedingt das eigentliche Problem sein.

            Grüße
            Thomas

            1. Hi Thomas

              Falls das immer noch nicht das ist was du möchtest, verstehe ich nicht, was du erreichen willst (mir ist das mit CDATA eh suspekt).
              Das "Variable überschreiben" muss ja nicht unbedingt das eigentliche Problem sein.

              Das Script dient als Template für ein CMS.

              Was ich erreichen möchte ist einen Index zu erstellen aus den Anfangsbuchstaben der Hersteller.

              Habe ich z.B. Audi, BMW, Borgwart, Daimler, Volvo und VW möchte ich nachher als Ausgabe "A B D V" stehen haben.
              Der Anfangsuchstabe wird jedes mal ausgegeben und in "anchor" gespeichert, wenn er sich von dem "anchor" der "Vorrunde" unterscheidet.

              In Pseudocode würde das dann wohl etwa so laufen:

              anchor = #

              Runde 1
              Hersteller = Audi

              != a

              anchor = a
              print anchor

              Runde 2
              Hersteller = BMW
              a != b
              anchor = b
              print anchor

              Runde 3
              Hersteller = Borgwart
              b == b

              Runde 4
              Hersteller = Daimler
              b != d
              anchor = d
              print anchor

              Runde 5
              Hersteller = Volvo
              d != v
              anchor = v
              print anchor

              Runde 6
              Hersteller = VW
              v == v

              Ich hoffe das ist etwas verständlicher :)

              Gruß
              Ole

              --
              Das Wort Vegetarier kommt aus dem Indianischen und bedeutet: Zu dumm zum Jagen.
              1. Hallo,

                »» Falls das immer noch nicht das ist was du möchtest, verstehe ich nicht, was du erreichen willst (mir ist das mit CDATA eh suspekt).
                »» Das "Variable überschreiben" muss ja nicht unbedingt das eigentliche Problem sein.

                Das Script dient als Template für ein CMS.

                Was ich erreichen möchte ist einen Index zu erstellen aus den Anfangsbuchstaben der Hersteller.

                Habe ich z.B. Audi, BMW, Borgwart, Daimler, Volvo und VW möchte ich nachher als Ausgabe "A B D V" stehen haben.
                Der Anfangsuchstabe wird jedes mal ausgegeben und in "anchor" gespeichert, wenn er sich von dem "anchor" der "Vorrunde" unterscheidet.

                Ich hoffe das ist etwas verständlicher :)

                Ja, es ist nun verstädlich. Und wie ich denke, der falscher Ansatz. (Was soll passieren, wenn die "anchor" »A B C A B C« ergibt? Da unterscheidet sich der nächste vom vorigen ja immer, aber es sind dennoch Wiederholungen)
                Hier würde sich doch eine Gruppierung anbieten.
                Einen ansatz findest du dazu unter:
                http://forum.de.selfhtml.org/archiv/2007/6/t154345/#m1005471

                Grüße
                Thomas

                1. Hallo Thomas,

                  Ja, es ist nun verstädlich. Und wie ich denke, der falscher Ansatz. (Was soll passieren, wenn die "anchor" »A B C A B C« ergibt? Da unterscheidet sich der nächste vom vorigen ja immer, aber es sind dennoch Wiederholungen)

                  Da ich ja vorher  mit

                  <xsl:sort order="ascending" select="hersteller" />

                  sortiere wird der skizierte Fall nicht eintreten. Zumindest haben alle meine Versuche mit einer unsortierten Liste diese immer korrekt sortiert ausgegeben.

                  Hier würde sich doch eine Gruppierung anbieten.
                  Einen ansatz findest du dazu unter:
                  http://forum.de.selfhtml.org/archiv/2007/6/t154345/#m1005471

                  Das sieht interessant aus. Sobald ich verstanden habe wie es funktioniert, werd ich es mal ausprobieren.

                  Danke & Gruß
                  Ole

                  --
                  Das Wort Vegetarier kommt aus dem Indianischen und bedeutet: Zu dumm zum Jagen.