Home
Über mich
Veröffentlichungen

XML XML-Schema XPath XSL-T XSL-FO XQuery XProc SVG

XPath / XPath-Funktionen / Zahlenfunktionen / avg()

avg()

avg()

➪ Die avg-Funktion berechnet den arithmetischen Durchschnitt der Zahlenwerte in der Sequenz (vorausgesetzt, es sind nur Werte enthalten, die auch als Zahlenwerte gecastet werden können). avg() steht erst seit XSLT 2.0 / XPath 2.0 zur Verfügung.

Auf dieser Seite:

Signatur:


avg($arg as xs:anyAtomicType*) as xs:anyAtomicType?

Siehe https://www.w3.org/TR/xpath-functions-31/func-avg

Siehe https://www.w3.org/TR/xpath-functions-30/func-avg

pic/avg.png

Die vorstehende Grafik stellt den Durchschnitt (rot dargestellt) der folgenden Sequenz dar (Ergebnis: 5, grau dargestellt):


avg(1, 9, 8, 5, 2, 7, 6, 3, 4)

Zufallsbasierte Werte können Sie mit random-number-generator() generieren:

pic/avg2.png

Einfache Beispiele

Nehmen Sie eine Sequenz von Items, die sich aus einem XML-Dokument auswerten und durch das XPath-Statement "//Gehalt" ansprechen lässt. Dann ergibt ...


<xsl:template match="/">
    <ergebnis>
        <xsl:value-of select="avg(//Gehalt)"/>
    </ergebnis>
</xsl:template>

... dieses Resultat:


<ergebnis>1253.5142105263158</ergebnis>

Ebenso können Sie der avg-Funktion auch eine selbst definierte Sequenz mitgeben.


<ergebnis>
    <xsl:value-of 
         select="avg(
                (7*25.99, 199, 1, (11 to 50)[. mod 9=1])
                )"/>
</ergebnis>

Diese selbst definierte Sequenz besteht dann aus den intern berechneten Werten (181.93, 199, 1, 19, 28, 37, 46), das Ergebnis lautet dann:


<ergebnis>73.13285714285714285714</ergebnis>

Wichtig ist auch hier, dass alle Items der Sequenz als Zahlen gecastet werden können. Das ist bei der folgenden Sequenz (1,2,3,4,5,'Hallo') nicht der Fall:


<ergebnis>
    <xsl:value-of select="avg((1 to 5, 'Hallo'))"/>
</ergebnis>

In diesem Fall ist mit einer Fehlermeldung zu rechnen, z.B.


FORG0006: Input to avg() contains a mix of numeric 
and non-numeric values, 
URL: http://www.w3.org/TR/2005/WD-xpath-functions-20050211/#ERRFORG0006

Wie auch bei der sum, klappt der korrekte Type-Cast in diesen Fällen:


(
  xs:integer(9),
  xs:decimal("8"),
  round(7.99999999999, 2) => xs:double(),  
  xs:decimal(true()),
  xs:float(false()),
  xs:integer(true())
)
=> avg()

true() wird als "1", false() als "0" interpretiert. Das Ergebnis ist in diesem Fall:


4.5

Der Type-Cast schlägt jedoch fehl bei:


(
  xs:negativeInteger(5),
  xs:short(45678),
  current-date(),
  xs:double(current-dateTime()),
  xs:decimal("Moin")  
)
=> avg()

Beispiel für avg-Aufrufe

Einen beispielhaften Einsatz kann die avg-Funktion in XQuery finden, wo Sie sämtliche Durchschnittswerte in einer Variable speichern, bevor Sie die Einzelwerte mit diesem Durchschnittswert vergleichen und (darauf aufbauend) in ein Element "mehr" oder "weniger" einbinden.


let $schnitt := avg(//Kauf/Gesamt)
return
<erg schnitt="{$schnitt}">
  {
    for $b in //Mensch
    return
      <kunde NN="{$b/name/text()}" 
             VN="{$b/vorname/text()}" 
             WO="{$b/../name/text()}">
          {
            for $ges in $b/Kauf/Gesamt
            return
              if (xs:decimal($ges) > $schnitt)
              then
                element mehr {$ges/text()}
              else
                element weniger {$ges/text()}
          }
      </kunde>
  }
</erg>

wg / 5. April 2020



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.




math:cos



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/avg.html