Announcement

Collapse
No announcement yet.

Maximalen Wert aus Variablen bestimmen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Maximalen Wert aus Variablen bestimmen

    Hallo zusammen,

    ich habe folgendes Problem:

    Hab in meinem xsl-file einige Variablen angelegt die in etwa dieses Format haben:

    <xsl:variable name="VB_TRUNK_LAND" select="/Project/SpecialData/Data[ID='B_TRUNK_LAND']/StartValue" />

    Das ganze kommt aus einer Messreihe von Daten, bei der bestimmte Phasen festgelegt sind (Stand/Absrpung/Landung) und jeweils über den entsprechenden Startwert (Startvalue) den enstprechenden Wert zu ermitteln.

    Nun möchte ich folgendes erreichen.

    Es soll immer aus 5-6 Variablen das Maximum bestimmt werden. Nicht aus allen.

    <xsl:variable name="MAX">
    <xsl:for-each select="//root/">
    <xsl:sort select="row" order="descending" />
    <xsl:if test="position()=1">
    <xsl:value-of select="row" />
    </xsl:if>
    </xsl:for-each>
    </xsl:variable>

    Das habe ich bis jetzt herrausgefunden. Leider kann ich somit nur entweder auf alle Variablen zugreifen oder auf andere Daten.

    Gibt es eine Möglichkeit die Variablen einzeln in "Ordner" zu legen um dann gezielt nur auf das Verzeichniss zugreifen zu können?

    Oder habt ihr noch andere Ideen?

    Danke und Grüße
    Tom

  • #2
    In deinem Post findet sich genau eine Variable namens "VB_TRUNK_LAND", die als Wert eine Knotenmenge (XSLT 1.0) bzw. Knotensequenz (XSLT 2.0) von "StartValue"-Elementen selektiert. Willst du nun das Maximum dieser "StartValue"-Elemente bestimmen? Oder das Maximum nur einer bestimmten Anzahl dieser "StartValue"-Elemente? Oder hast du noch eine weitere Variable? So du noch eine weitere Variable hast, kannst du die Vereinigung bilden, also etwa
    Code:
    <xsl:for-each select="$VB_TRUNK_LAND | $V2">
      <xsl:sort select="." order="descending"/>
      <xsl:if test="position() = 1">
        <xsl:value-of select="."/>
      </xsl:if>
    </xsl:for-each>
    Beachte auch, dass XSLT 2.0 eine "max"-Funktion hat: http://www.w3.org/TR/xpath-functions/#func-max.

    Comment


    • #3
      Super! Vielen Dank, dass mit der Vereinigung hat geklappt

      Ich hätte noch eine weitere Frage:
      Kann man einer Variable einen variablen Wert zuweisen? Mit xsl:if oder xsl:choose?

      So habe ich es bis jetzt probiert:

      <xsl:variable name="MAX_ST">

      <xsl:if test="$MAX_ST1A &lt; $MAX_ST2A">
      <xsl:value-of select="$MAX_ST2A"/>
      </xsl:if>
      <xsl:if test="$MAX_ST1A &gt; $MAX_ST2A">
      <xsl:value-of select="$MAX_ST1A"/>
      </xsl:if>

      </xsl:variable>

      Funktioniert leider nicht.

      Comment


      • #4
        Mit XSLT/XPath 2.0 gibt es einen "if (condition) then epxression1 else expression2"-Ausdruck, also sollte
        Code:
        <xsl:variable name="MAX_ST" select="if ($MAX_ST1A &lt; $MAX_ST2A) then $MAX_ST2A else $MAX_ST1A"/>
        reichen.
        Mit XSLT 1.0 sollte ein xsl: choose/when/otherwise als Inhalt von xsl: variable reichen:
        Code:
        <xsl:variable name="MAX_ST">
          <xsl:choose>
             <xsl:when test="$MAX_ST1A &lt; $MAX_ST2A">
               <xsl:value-of select="$MAX_ST2A"/>
            </xsl:when>
           <xsl:otherwise>
             <xsl:value-of select="$MAX_ST1A"/>
          </xsl:otherwise>
        </xsl:variable>
        Das kommt dem XSLT 2.0 Code am nächsten, aber dabei ist die Variable MAX_ST vom Typ "result tree fragment" mit einem Textknoten, der als Inhalt den Wert der im value-of selektieren Variable hat, während man in XSLT 2.0 mit dem if-then-else einfach eine Variable vom Typ des im "then" bzw. "else"-Zweig selektierten Ausdruckes hat.

        Auch deine Variante mit dem xsl: if innerhalb des xsl: variable sollte aber zu einem Ergebnis führen, bei dem ein "result tree fragment" erzeugt wird, in dem ein Textknoten enthalten ist.

        Comment


        • #5
          Ich arbeite mit XSLT 1.0..

          Kann man den Typ "reslut tree fragment" irgendwie in einen "number" umwandeln?
          Ich bräuchte den Wert um weitere Berechnungen durchzuführen.

          Comment


          • #6
            Code:
            <xsl:variable name="v1" select="number($MAX_ST)"/>
            sollte reichen, um aus dem "result tree fragment" explizit eine Zahl zu machen. Das sollte aber auch implizit passieren, so man $MAX_ST in einem numerischen Kontext verwendet (also etwa "10 + $MAX_ST").

            Comment

            Working...
            X