josef stebegg: choose und sort

hallo.

Ich habe mit xsl:sort und position:relative eine stufenfoermige Personenliste erstellt.
Um Platz zu sparen wollte ich ab Mitte die Richtung aendern
(von downstais to upstairs bzw von ascending to descending).
Als "Umschalter" kann ich mir nur xsl:choose vorstellen.
Offensichtlich vertragen sich diese beiden xslt elemente aber nicht.

"Das Schlueselwort xsl:sort kann hier nicht verwendet werden."
bzw
"Das Schlueselwort xsl:choose darf nicht....." etc.

Was auch die ( ....element darf in ...element vorkommen ) Hinweise erhaerten.

Gibt es da noch einen anderen Weg?

gruesse
josef

  1. Hi!

    Gibt es da noch einen anderen Weg?

    Hm, vielleicht probierst du mal was ähnliches wie

    <xsl:for-each select="element[position() < last() div 2]">
    <xsl:sort ... order="ascending" />
    ...
    </xsl:for-each>
    <xsl:for-each select="element[position()>=last() div 2]">
    <xsl:sort ... order="descending" />
    ...
    </xsl:for-each>

    Oder so ähnlich :)
    Du musst es halt irgendwie hinkriegen, dass Du zuerst als zu sortierendes Node-Set nur die erste Hälfte der Knoten auswählst und dann die zweite Hälfte. Nur so 'ne Idee.

    VG Simon

    1. Hi!

      Gibt es da noch einen anderen Weg?

      Hm, vielleicht probierst du mal was ähnliches wie

      <xsl:for-each select="element[position() < last() div 2]">
      <xsl:sort ... order="ascending" />
      ...
      </xsl:for-each>
      <xsl:for-each select="element[position()>=last() div 2]">
      <xsl:sort ... order="descending" />
      ...
      </xsl:for-each>

      Oder so ähnlich :)
      Du musst es halt irgendwie hinkriegen, dass Du zuerst als zu sortierendes Node-Set nur die erste Hälfte der Knoten auswählst und dann die zweite Hälfte. Nur so 'ne Idee.

      VG Simon

      Danke fuer die Antworten von Franz und Simon.
      Der Ansatz von Simon wuerde schon passen. Er hat nur noch einen Schoenheitsfehler.
      Die Treppe schaut jetzt so aus:

      -
          -
                  -
               -
            -

      Damit sie etwa so ausschaut:
      -       -
        -   -
         --
      muesste beim aufsteigenden Ast fuer jede top-position ein konstanter wert (hier z.B. 80) abgezogen werden.
      ...
      <xsl:for-each select="person[position() > last() div 2]">
      <xsl:sort select="@geb" data-type="number" order="descending" />
      <xsl:variable name="lage">left:<xsl:value-of select="@geb *2 - 2966"/>px</xsl:variable>
       ...

      <xsl:variable name="lage3">top:<xsl:value-of select="person[position()-80]"/>px</xsl:variable>

      <div style="position:absolute; {$lage}; {$lage3};" >
       ....... usw.

      Ich komme leider nicht auf die richtige xpath syntax .
         "(person[position()])-80" etc.

      gruesse
      josef

      1. Hallo Josef,

        ich kürze ab:

        <xsl:for-each select="person[position() > last() div 2]">
        <xsl:variable name="lage3">top:<xsl:value-of select="person[position()-80]"/>px</xsl:variable>

        1. du bist bereits innerhalb von for-each für person
        2. dann holst nochmal die position von person: was du machst ist also person/person[position()].

        was du aber brauchst ist die position der aktuellen person:

        <xsl:value-of select="current()[position()-80]"/>px</xsl:variable>

        Grüße
        Thomas

        1. Hallo Josef,

          ich kürze ab:

          <xsl:for-each select="person[position() > last() div 2]">
          <xsl:variable name="lage3">top:<xsl:value-of select="person[position()-80]"/>px</xsl:variable>

          1. du bist bereits innerhalb von for-each für person
          2. dann holst nochmal die position von person: was du machst ist also person/person[position()].

          was du aber brauchst ist die position der aktuellen person:

          <xsl:value-of select="current()[position()-80]"/>px</xsl:variable>

          Grüße
          Thomas

          Hallo Thomas.

          Danke fuer die Hilfe und die zusaetzliche Fehlererklaerung.

          gruesse
          josef

  2. Hallo,

    Als "Umschalter" kann ich mir nur xsl:choose vorstellen.
    Offensichtlich vertragen sich diese beiden xslt elemente aber nicht.

    xsl:sort kann nur direkt als Kind von xsl:for-each oder xsl:apply-templates vorkommen.

    Gibt es da noch einen anderen Weg?

    Um ehrlich zu sein, habe ich weder verstanden was du versucht hast, noch, was du genau erreichen willst...

    Gruß
    Franz