1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

XSL Transformation - Maximalen Wert mehrerer Knoten bestimmen

Dieses Thema im Forum "XML Technologien" wurde erstellt von Meiki Jay, 4. Oktober 2012.

  1. Meiki Jay

    Meiki Jay Mitglied

    Hallo,
    ich habe eine frage und zwar würde ich gerne den maximalen Wert aus verschiednen Knoten herausfinden.

    Das xml ist so aufgebaut:
    Code (Text):
    1. <root>
    2.      <wahltyp>  
    3.        <buergermeister value="BG">  
    4.           <name value="">
    5.             <logo>SPÖ</logo>
    6.             <prozent_bgm>53,23</prozent_bgm>
    7.           </name>
    8.           <name2 value="">
    9.             <logo2>ÖVP</logo2>
    10.             <prozent_bgm2>43.84</prozent_bgm2>
    11.           </name2>
    12.           <name3 value="">
    13.             <logo3>FPÖ</logo3>
    14.             <prozent_bgm3>2.79</prozent_bgm3>
    15.           </name3>
    16.           <name4 value="">
    17.             <logo4>GRÜNE</logo4>
    18.             <prozent_bgm4>80</prozent_bgm4>
    19.           </name4>
    20.           <name5 value="">
    21.             <logo5>LBL</logo5>
    22.             <prozent_bgm5>0.6</prozent_bgm5>
    23.           </name5>
    24.       </buergermeister>
    25.     </wahltyp>
    26. </root>
    Im Grunde handelt es sich hierbei um ein Ausschnitt eines XMLs in dem Wahlergebnisse stehen. Nun bräuchte ich die Größte prozent_bgm. Die Tagnamen kann ich nicht ändern, da das XML so geliefert wird.

    Alle bisherigen Versuche sind gescheitert. Unter anderem habe ich das mit math:max bzw. fn:max probiert. Beide male erfolglos. Auch habe ich versucht die Werte mittels xsl:sort zu sortieren und dann so an das Größte zu kommmen waren bisher auch vergeben.

    Ich danke jetzt schonmal für eure Hilfe.
    lg Michael
     
  2. deepthroat

    deepthroat Erfahrenes Mitglied

    Hi.

    Zuerst einmal, das Schema des XML Dokuments ist ganz großer Mist - wie du schon selbst gemerkt hast.

    Du könntest es z.B. so machen:
    Code (XML):
    1. <xsl:for-each select="/root/wahltyp/buergermeister/child::node()">
    2.   <xsl:sort order="descending" data-type="number" case-order="upper-first"
    3.      select="child::node()[starts-with(name(), 'prozent_bgm')]"/>
    4.  
    5.   <xsl:value-of select="..." />
    6. </xsl:for-each>
     
    Zuletzt von einem Moderator bearbeitet: 23. Mai 2014
  3. RavenOnJ

    RavenOnJ Mitglied

    deine <namex> sollten alle gleich sein, z.B. <name> (, wobei ich persönlich diese Bezeichnung für zu nichtssagend halte in dem Zusammenhang). Das Attribut 'value' macht vermutlich keinen Sinn. Analoges gilt für <logox> und <prozent_bgmx>. Für 'logo' gibt es vermutlich auch eine bessere Bezeichnung. Bei XML geht es immer auch um Semantik, deswegen sollten die Bezeichner sinnvoll gewählt werden.

    Gruß
    Peter
     
  4. Meiki Jay

    Meiki Jay Mitglied

    Hallo,
    Danke für die Antworten, inzwischen haben wir auch schon eine Lösung gefunden, ähnlich die von deepthroat.

    Code (Text):
    1. <xsl:if test="position() = 1">
    2.           <xsl:choose>
    3.             <xsl:when test="number(translate(*[starts-with(name(), 'prozent_bgm')], ',.' , '.,' )) &gt; 50">
    4.               <buergermeister>
    5.                 <partei_bgm><xsl:value-of select="*[starts-with(name(), 'logo')]" />*</partei_bgm>
    6.                 <prozent_bgm>
    7.                   <xsl:value-of select="*[starts-with(name(), 'prozent_bgm')]" />
    8.                 </prozent_bgm>
    9.                 </ergebnis_bd>
    10.               </buergermeister>
    11.             </xsl:when>
    12.             <xsl:when test="*[starts-with(name(), 'prozent_bgm')] = ''">
    13.               <buergermeister>Keine Daten</buergermeister>
    14.             </xsl:when>
    15.             <xsl:otherwise>
    16.               <buergermeister>stichwahl</buergermeister>
    17.             </xsl:otherwise>
    18.           </xsl:choose>
    19.         </xsl:if>
    20.       </xsl:for-each>
    Im Grunde reicht es zu schauen ob einer der Prozent Werte größer als 50 ist, so kriegt mana uch den richtigen Bürgermeister.

    lg Michael
     
  5. deepthroat

    deepthroat Erfahrenes Mitglied

    Wobei in deinem Beispieldokument 2 Parteien mehr als 50% erreicht haben... :confused:

    Und braucht man denn für den Bürgermeister eine absolute Mehrheit?
     
Die Seite wird geladen...