XPath 3.0, XPath 2.0, XPath 1.0 / 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.

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

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 / 4. April 2018



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.




min()



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