XPath / XPath-Funktionen / Zahlenfunktionen / 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
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:
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()
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
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de