(aktualisiert!)

IT-Trainings in Zeiten des Corona-Virus, Veranstaltungstipps der www.gfu.net:
Schulung XML Einfuehrung und Grundlagen *** Schulung Python fuer Programmiereinsteiger *** Schulung XML, XSLT, XPath, XSL-FO Einfuehrung *** Schulung Java/JSP/HTML/JDBC/XML Komplett *** Schulung XML mit Altova XMLSpy *** Schulung XML Grundlagen, XSL-FO, SVG, DocBook, DITA *** Schulung XML - der professionelle Ueberblick *** Schulung XML-Schema Intensiv *** Schulung Einstieg in die Programmierung *** Schulung C++ fuer Programmiereinsteiger *** Schulung VB.NET fuer Visual Basic-Programmierer ***


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.

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 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 , 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 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