fn:avg

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 5.)

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

   

Kategorie: Aggregation

Herkunft: XPath 2.0

Rückgabewert: Der Durchschnittswert der Items einer Eingabesequenz (Summe dividiert durch Anzahl) – der Typ des Resultats entspricht dem Typ der Eingangswerte.

Aufruf/Argumente:

fn:avg($eingabesequenz)

$eingabesequenz:
Die Items der Eingabesequenz müssen vom gleichen Typ (oder Subtypen des gleichen Typs) sein und auf diesen Typ muss numerische Addition und anschließende Integerdivision anwendbar sein. Es kann sich (nach entsprechender, automatisch vor­genommener Typ-Promotion) also um gleichartige Zahlen­werte oder Zeitdauerwerte (entweder xs:yearMonthDuration oder xs:dayTimeDuration) handeln. Ein übergebener nicht-typisierter atomarer Typ xs:untypedAtomic wird in den Zahlentyp xs:double umgewandelt. Sind die übergebenen Werte nach erfolgter Typ-Promotion nicht zueinander kompatibel, so erfolgt die Fehlermeldung Invalid argument type (err:FORG0006).

Verwendungszweck:

Die Funktion berechnet einen Durchschnittswert aus den Items einer überge­benen Sequenz, entsprechend ihrer Summe geteilt durch die Zahl der Items. Ist die Eingabesequenz leer, so wird die leere Sequenz zurückgegeben.

Die Berechnung erfolgt analog zu

sum($eingabesequenz) div count($eingabesequenz)

Zahlenwerte verschiedenen Typs werden gemäß der Regeln für Typ-Promotion in gleiche Typen umgewandelt. Enthält die Eingangssequenz einen oder meh­rere Werte NaN, so ist der Rückgabewert der Funktion ebenfalls NaN.

Besteht die Sequenz aus Werten vom Typ Zeitdauer, so müssen alle Items ent­weder vom Typ xs:yearMonthDuration oder vom Typ xs:dayTimeDuration sein.

Innerhalb der Eingangssequenz dürfen Werte vom Typ xs:untypedAtomic enthalten sein, die in diesem Fall dem Typ der restlichen Items angepasst wer­den. Handelt es sich bei allen Werten um xs:untypedAtomic so werden sie in xs:double umgewandelt.

Beispiele:

Beispiel 1 – Durchschnitt aus einer Sequenz aus Ganzzahlen xs:integer:

fn:avg(4, 5, 6)

ergibt 5

In diesem einfachen Fall werden die Werte addiert und durch die Anzahl der enthaltenen Items geteilt.

Beispiel 2 – Durchschnitt aus einer Sequenz aus Zeitdauerwerten:

fn:avg( xs:yearMonthDuration("P10Y"),
        xs:yearMonthDuration("P20M")
  )

ergibt xs:yearMonthDuration("P70M")

Bei der Durchschnittsbildung aus Zeitdauerwerten verschiedener Einheit wer­den diese nach Umrechnung in die kleinste vorkommende Einheit addiert und durch die Anzahl der Werte geteilt. Hier ergibt sich für den ersten Wert P10Y (10 Jahre, entsprechend 120 Monaten) und den zweiten Wert P20M (20 Monate) eine Summe von 140 Monaten und somit der Durchschnittswert 70 Monate.

Beispiel 3 – Verbotene Operation:

fn:avg(xs:yearMonthDuration("P10Y"), 4, 5, 6)

ergibt die Fehlermeldung »Invalid argument type« (err:FORG0006). Eine Umwandlung der in der Sequenz vorhandenen Typen xs:yearMonthDuration und xs:integer ineinander ist nicht möglich – die Fehlermeldung erfolgt auf Grund dieser Nichtkompatibilität.

Beispiel 4 – Leere Sequenz abfangen mit fn:exactly-one:

In manchen Fällen ist das Verhalten von fn:avg() in Bezug auf eine leere Ein­gangssequenz unerwünscht. Soll beispielsweise eine Fehlermeldung erfolgen, wenn keine Eingangsdaten vorhanden sind, aus denen ein Durchschnitt gebil­det werden kann, so besteht eine Lösung darin, den Rückgabewert mittels der Funktion fn:exactly-one() zu überprüfen. Wird ein (per Definition einzelner) Durchschnittswert zurückgegeben, so wird dieser transparent weitergegeben; im Fall der leeren Ergebnissequenz wird hingegen ein Fehler gemeldet.

fn:exactly-one( fn:avg($daten)
  )

ergibt die Fehlermeldung »fn:exactly-one called with a sequence containing zero or more than one item« (err:FORG0005), falls der Eingabeausdruck $daten von fn:avg() die leere Sequenz ist und die Funktion daher anstelle des gewünschten Durchschnittswertes ebenfalls die leere Sequenz zurückgibt.

Funktionsdefinition:

XPath 1.0:

Funktion nicht verfügbar

XPath 2.0:

fn:avg($srcval as xs:anyAtomicType*) as xs:anyAtomicType?

   

<< zurück vor >>
Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © Galileo Press, Bonn 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT 2.0 & XPath 2.0 ― Das umfassende Handbuch" denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Galileo Press, Rheinwerkallee 4, 53227 Bonn