Anzeige

XSL Transformation - Maximalen Wert mehrerer Knoten bestimmen


#1
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
 

deepthroat

Erfahrenes Mitglied
#2
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:
#3
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
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
 
Anzeige

Neue Beiträge

Anzeige