XSL Transformation - Maximalen Wert mehrerer Knoten bestimmen

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:
<root>
     <wahltyp>  
       <buergermeister value="BG">  
          <name value="">
            <logo>SPÖ</logo>
            <prozent_bgm>53,23</prozent_bgm>
          </name>
          <name2 value="">
            <logo2>ÖVP</logo2>
            <prozent_bgm2>43.84</prozent_bgm2>
          </name2>
          <name3 value="">
            <logo3>FPÖ</logo3>
            <prozent_bgm3>2.79</prozent_bgm3>
          </name3>
          <name4 value="">
            <logo4>GRÜNE</logo4>
            <prozent_bgm4>80</prozent_bgm4>
          </name4>
          <name5 value="">
            <logo5>LBL</logo5>
            <prozent_bgm5>0.6</prozent_bgm5>
          </name5>
      </buergermeister> 
    </wahltyp> 
</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
 
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:
XML:
<xsl:for-each select="/root/wahltyp/buergermeister/child::node()">
  <xsl:sort order="descending" data-type="number" case-order="upper-first"
      select="child::node()[starts-with(name(), 'prozent_bgm')]"/>

  <xsl:value-of select="..." />
</xsl:for-each>
 
Zuletzt bearbeitet von einem Moderator:
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
 
Hallo,
Danke für die Antworten, inzwischen haben wir auch schon eine Lösung gefunden, ähnlich die von deepthroat.

Code:
<xsl:if test="position() = 1">
          <xsl:choose>
            <xsl:when test="number(translate(*[starts-with(name(), 'prozent_bgm')], ',.' , '.,' )) &gt; 50">
              <buergermeister>
                <partei_bgm><xsl:value-of select="*[starts-with(name(), 'logo')]" />*</partei_bgm>
                <prozent_bgm>
                  <xsl:value-of select="*[starts-with(name(), 'prozent_bgm')]" />
                </prozent_bgm>
                </ergebnis_bd>
              </buergermeister>
            </xsl:when>
            <xsl:when test="*[starts-with(name(), 'prozent_bgm')] = ''">
              <buergermeister>Keine Daten</buergermeister>
            </xsl:when>
            <xsl:otherwise>
              <buergermeister>stichwahl</buergermeister>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:if>
      </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
 
Zurück