C#.NET * C++ * JAVASCRIPT * PYTHON * XML
* XML-SCHEMA * XPATH * XSL * XSL-FO * SVG * XQUERY * XPROC



XPath / XPath-Funktionen / Zahlenfunktionen / Minimale, maximale und durchschnittliche Spannweiten

Minimale, maximale und durchschnittliche Spannweiten

Minimale, maximale und durchschnittliche Spannweiten

➪ In diesem Beispiel werden die Spannweiten mehrerer Ergebnisse berechnet deren Minimal-, Maximal- und Durchschnittswerte ermittelt.

Auf dieser Seite:

Gegeben sei das folgende Input-Dokument.


<input>
    <werte>
        <wert>90.0</wert>
        <wert>90.45</wert>
    </werte>
    <werte>
        <wert>21.36</wert>
        <wert>21.42</wert>
    </werte>
    <werte>
        <wert>50.40</wert>
        <wert>50.49</wert>
    </werte>
</input>

Lösung in XSL 2.0:

In XSL 2.0 ist es sinnvoll, die Einzelwerte in eine separate zu schreiben und die komplexe Nodelist auszuwerten.


<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
    <xsl:output method="xml" indent="yes"></xsl:output>
    <xsl:template match="/">
        <xsl:variable name="v">                
            <xsl:for-each select="//werte">
                <diff>                        
                    <xsl:value-of select="max(wert/text()) - min(wert/text())"/>
                </diff>
            </xsl:for-each>
        </xsl:variable>
        <erg 
            avg_Spannweite="{avg($v/diff)}"
            max_Spannweite="{max($v/diff)}"
            min_Spannweite="{min($v/diff)}"/>
    </xsl:template>
</xsl:stylesheet>

Lösung in XSL 3.0:

In XSL 3.0 können die einzelnen Spannweiten unmittelbar über den -Operator generiert und nachfolgend über den Operator den diversen Funktionen zugewiesen werden. Siehe auch die Anmerkungen zur Lösung in XPath 3.0.


<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  version="3.0">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">    
    <erg 
      avg_Spannweite="{(//werte) ! (max(wert) - min(wert)) => avg()}"
      max_Spannweite="{(//werte) ! (max(wert) - min(wert)) => max()}"
      min_Spannweite="{(//werte) ! (max(wert) - min(wert)) => min()}"/>
  </xsl:template>
</xsl:stylesheet>

Lösung in XPath 3.0

Die Einzelwerte, hier: max(), erhalten Sie in Xpath 3.0 so:


(//werte) ! (max(wert) - min(wert)) => max()

Lösung in XQuery

Auch in XQuery ist es sinnvoll, die Liste der berechneten Spannweiten in einer Variablen zu speichern und diese auszuwerten.


let $v := (//werte) ! (max(wert) - min(wert)) 
return 
<erg avg_Spannweite="{avg($v)}"
     max_Spannweite="{max($v)}"
     min_Spannweite="{min($v)}"/>

Sinnvoll ist auch hier die Typkontrolle: Erst hier wird deutlich, dass $v vom Typ xs:decimal* ist.


let $v as xs:decimal* := (for $w in //werte return ( 
  xs:decimal(max($w/wert/text()) - min($w/wert/text()))
)) 
return 
<erg avg_Spannweite="{avg($v)}"
     max_Spannweite="{max($v)}"
     min_Spannweite="{min($v)}"/>

Lösung über Array in XQuery

Dasselbe Resultat erhalten Sie, wenn Sie mit einem arbeiten:


let $myarray := array{ (for $w in //werte return ( 
  xs:decimal(max($w/wert/text()) - min($w/wert/text()))
)) }
return 
<erg avg_Spannweite="{avg($myarray)}"
     max_Spannweite="{max($myarray)}"
     min_Spannweite="{min($myarray)}"/>

Lösung über Map in XQuery

Sie arbeiten lieber mit ? Kein Problem:


let $v as xs:decimal* := (for $w in $i//werte return ( 
  xs:decimal(max($w/wert/text()) - min($w/wert/text()))
)) 
let $vvar := map{
         'max': max($v), 
         'min': min($v), 
         'avg': avg($v)
}       
return 
<erg avg_Spannweite="{map:get($vvar, 'avg')}"
     max_Spannweite="{map:get($vvar, 'max')}"
     min_Spannweite="{map:get($vvar, 'min')}"/>

wg / 9. Mai 2020



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.



V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/Statistik1.html