fn:max

(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: Eine Sequenz aus einem atomaren Item, das den höchsten Wert aller Items der Eingabesequenz besitzt – nach Vereinheitlichung ihrer Typen.

Aufruf/Argumente:

fn:max($eingabesequenz?, $collation-URI)

$eingabesequenz:
Eine Sequenz aus ein oder mehreren atomaren Items xs:anyAtomicType. Besteht die Eingabesequenz nicht vollständig aus Items atomaren Typs, so werden die betreffenden Items im Vorfeld atomisiert. Ist die Eingabesequenz leer, so wird die leere Sequenz zurückgegeben.

$collation-URI:
Optional. Das zweite Argument besteht aus einem String xs:string, der den URI-String der anzuwendenden Collation benennt. Der Wert muss lexikalisch dem Typ xs:anyURI entsprechen. Wird kein zweites Argument übergeben, so wird für den Stringvergleich die Default-Collation herangezogen.

Verwendungszweck:

Die Funktion fn:max() gibt stets eine Sequenz aus einem einzelnen Item zurück, dass den höchsten Wert aller Items einer der Funktion übergebenen Eingabesequenz besitzt. Der Typ des zurückgegebenen Maximalwerts muss nicht notwendigerweise dem Typ des korrespondierenden Items der Eingabesequenz gleichen, da die Rückgabe stets nach einer Typvereinheitlichung erfolgt (beispielsweise kann eine Zahl vom Typ xs:float aus der Eingangssequenz als Maximalwert in Form xs:double zurückgegeben werden).

Haben mehrere oder alle Items denselben höchsten Wert, so wird nur eines der betreffenden Items zurückge­geben (welches genau, ist abhängig von der Implementierung).

Ist die Eingangssequenz leer, so gibt die Funktion die leere Sequenz zurück. Ein Fehler wird nicht gemeldet. Wird genau dies aber gewünscht, so kann das Vor­handensein eines Rückgabewertes mittels der Funktion fn:exactly-one() überprüft werden (siehe Beispiel 3).

Die Items der Eingabesequenz müssen atomar und in einer Form (bezeichnet als total order) vorliegen, die ihre Vergleichbarkeit mittels des ge-Operators  (»greater or equal«) gewährleistet. Im Wesentlichen bedeutet »total order«, dass es für zwei Grö­ßen, die als ungleich erkannt wurden, feststellbar sein muss, welche der beiden größer bzw. kleiner als die andere ist. Eine Grundvoraussetzung besteht in der Typgleichheit aller Werte, wobei auch Subtypen (derived types) der entspre­chenden Typen zugelassen sind.

Sind Items der Eingabesequenz vom Typ xs:untypedAtomic, so werden sie in den Zahlentyp xs:double umgewandelt.

Ist die Typgleichheit und damit die Vergleichbarkeit nicht gewährleistet oder durch Typumwandlungen nicht zu erreichen, so wird ein entsprechender Feh­ler ausgegeben: »Invalid argument type« (err:FORG0006).

Vergleich numerischer Werte:

Die Typgleichheit numerischer Werte wird gegebenenfalls durch Typ-Promotion (Umwandlung in einen übergeordneten numerischen Typ) hergestellt. Enthält die Eingangssequenz ein oder mehrere Items vom Wert NaN, so gibt die Funktion den Wert NaN zurück.

Vergleich von Datums- und Zeitwerten:

Die Vergleichbarkeit von Werten der Typen xs:dateTime, xs:date oder xs:time erfordert die grundsätzliche An- oder Abwesenheit einer Zeitzonen­angabe. Besitzt ein derartiger Wert eine entsprechende Angabe nicht, so wird die implizite Zeitzonenabgabe hinzugefügt, wie sie sich aus dem Bewertungs­kontext ergibt. Der Datums- oder Zeitwert wird – falls erforderlich – auf dieser Grundlage normalisiert und in dieser Form für die Vergleiche herangezogen. Unterscheiden sich (normalisierte) Maximalwerte nur anhand ihrer Zeitzonen­angabe, ist es der Implementation überlassen, welcher der Werte zurückgege­ben wird.

Vergleich von Zeitdauerwerten:

Zu vergleichende Zeitdauerwerte müssen entweder alle vom Typ xs:yearMonthDuration oder alle vom Typ xs:dayTimeDuration sein.

Vergleich von URI-Werten und Strings:

Der Vergleich zwischen URI-Werten xs:anyURI und Zeichenketten xs:string wird, nach Umwandlung von Items des Typs xs:anyURI in xs:string, anhand einer Collation bestimmt. Hierbei findet entweder die Default-Collation oder die durch das zweite Funktionsargument bestimmte Collation Verwendung. 

Der Vergleich von Zeichenketten wird im einfachsten Fall Zeichen für Zeichen vorgenommen, wobei als Grundregel gilt:

[z – a] > [Z – A] > [9 – 0]

Der zur Bezeichnung der Collation übergebene Wert muss lexikalisch dem Typ xs:anyURI entsprechen. Wird die Collation nicht unterstützt, so erfolgt die Fehlermeldung »Unsupported collation« (err:FOCH0002).

Wurde eine Collation angegeben, besitzen die Items der Eingabesequenz (nach eventueller Typumwandlung) jedoch nicht den Typ xs:string, so wird das Collation-Argument ignoriert, ohne dass ein Fehler gemeldet wird. Dies geschieht beispielsweise dann, wenn die Eingabesequenz aus numerischen Typen besteht.

Beispiele:

Beispiel 1 – Maximum aus einer numerischen Sequenz:

fn:max((4, 5, 6, 7))

gibt 7 zurück (vom Typ xs:integer).

Beispiel 2 – Maximum aus einer Stringsequenz:

fn: max(('bb','aa', 'AA'))

gibt 'bb' zurück (vom Typ xs:string).

Beispiel 3 – Leere Sequenz abfangen:

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

ergibt die Fehlermeldung: »fn:exactly-one called with a sequence containing zero or more than one item«, falls die Eingabesequenz von fn:max() zur leeren Sequenz führt und die Funktion die leere Sequenz zurückgibt.

In manchen Fällen ist das Verhalten von fn:max() in Bezug auf eine leere Ein­gangssequenz unerwünscht. Soll beispielsweise eine Fehlermeldung erfolgen, wenn keine Eingangsdaten vorhanden sind, aus denen ein Maximalwert ermit­telt werden kann, so besteht eine Lösung darin, den Rückgabewert mittels der Funktion fn:exactly-one() zu überprüfen. Wird ein Maximalwert zurückge­geben, so wird dieser transparent weitergegeben. Im Fall der leeren Sequenz erfolgt hingegen ein Fehler.

Funktionsdefinition:

XPath 1.0:

Funktion nicht verfügbar

XPath 2.0:

fn:max($arg as xs:anyAtomicType*) as xs:anyAtomicType?

fn:max($arg as xs:anyAtomicType*,
       $collation as string)      as xs:anyAtomicTyp
e?

   

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