• +49-(0)721-402485-12
Ihre Experten für XML, XQuery und XML-Datenbanken

Funktionen auf numerischen und booleschen Werten

Bei der Behandlung von XQuery-Ausdrücken in den vorangegangenen Kapiteln sind bereits Funktionen auf numerischen und booleschen Werten implizit verwendet worden, so dass an dieser Stelle nur eine Abrundung und Ergänzung zu den bereits vorgenommenen Ausführungen erfolgen muss.

Operatoren auf numerischen Werten

Für jeden eingebauten arithmetischen Operator (wie beispielsweise +) existiert ein entsprechender Operator aus der XQuery-Funktionsbibliothek (zum Beispiel op:numeric-add()). Da die Liste der Operatoren bereits bei der Erläuterung arithmetischer Ausdrücke behandelt wird, kann hier auf eine detaillierte Beschreibung verzichtet werden.

Funktionen auf numerischen Werten

Die Menge der Funktionen zur Manipulation numerischer Werte besteht aus den fünf in der unten stehenden Tabelle zusammengefassten Funktionen. Die Funktionen fn:abs(), fn:ceiling() und fn:floor() werden in der Tabelle erklärt und an folgendem Beispiel illustriert:

<BeispielNumerischeFunktionen>
{
let $x := 4711.5, $y := -4711.5
return (
<ABS><X>{fn:abs($x)}</X>
<Y>{fn:abs($y)}</Y></ABS>,
<CEILING><X>{fn:ceiling($x)}</X>
<Y>{fn:ceiling($y)}</Y></CEILING>,
<FLOOR><X>{fn:floor($x)}</X>
<Y>{fn:floor($y)}</Y></FLOOR>)
}
</BeispielNumerischeFunktionen>

Das Ergebnis besteht dann aus folgenden Wertepaaren (wobei die Formatierung aus Gründen der übersichtlichen Darstellung erhalten bleibt):

<BeispielNumerischeFunktionen>
<ABS><X>4711.5</X>
<Y>4711.5</Y></ABS>
<CEILING><X>4712</X>
<Y>-4711</Y></CEILING>
<FLOOR><X>4711</X>
<Y>-4712</Y></FLOOR>
</BeispielNumerischeFunktionen>

Übersicht von Funktionen auf numerischen Werten

SignaturBeschreibung
fn:abs(
$arg as numeric?)
as numeric?
absoluter Wert des Argumentwerts $arg
fn:ceiling(
$arg as numeric?)
as numeric?
kleinste ganze Zahl, die größer oder gleich
dem Wert des Arguments $arg ist
fn:floor(
$arg as numeric?)
as numeric?
größte ganze Zahl, die kleiner oder gleich
dem Wert des Arguments $arg ist
fn:round(
$arg as numeric?)
as numeric?
nächstliegende ganze Zahl mit Bezug auf
den Wert des Arguments $arg; bei zwei
möglichen Ergebnissen, die größere von
beiden; äquivalent zu fn:floor($arg + 0.5)
fn:round-half-to-even(
$arg as numeric?[,
$precision as xs:integer])
as numeric?
nächstliegende Zahl mit Bezug auf den Wert
des Arguments $arg, die ein Vielfaches zu
10-$precision ist; bei zwei möglichen Ergebnissen
dasjenige, dessen geringwertigste Stelle gerade
ist; das Weglassen von $precision ist äquivalent
zu $precision = 0

Die beiden weiteren Funktionen erlauben das Runden von Werten, wobei sich die Semantik in der Behandlung der Grenzwerte unterscheidet. Die Funktion fn:round() rundet auf die nächste ganze Zahl – im Grenzfall auf die größere von beiden. Die Funktion fn:round-half-to-even() hingegen wählt die Zahl, deren geringwertigste Ziffer gerade ist. Zum Beispiel liefert fn:round(), angewandt auf 1.5 , 2.5 und 3.5, die Ergebnisse 2, 3, 4, während fn:round-half-to-even() (mit einer Genauigkeit von 0) die Ergebnisse 2, 2, 4 liefern würde. Zusätzlich erlaubt die Angabe einer Genauigkeit bei fn:round-half-to-even() die Rundung auf Nach- bzw. Vorkommastellen, wie folgendes Beispiel illustriert:

let $x := xdt:untypedAtomic(3.567812E+3),
$y := (4.7564E-3), $z := (35612.25)
where fn:round-half-to-even($x, 2) eq 3567.81E0
and fn:round-half-to-even($y, 2) eq 0.0E0
and fn:round-half-to-even($z,-2) eq 35600
return
<Text>Dieser Text wird erscheinen!</Text>

Die initialisierten Werte der Variablen $x, $y und $z sind ursprünglich vom Datentyp xdt:untypedAtomic, xs:double und xs:decimal. Der Wert von $x wird bei der Auswertung der Funktion automatisch in einen Wert vom Typ xs:double konvertiert; für die verbleibenden Variablen ändert sich der Typ nicht, so dass die Ergebnisse der Funktionen vom Typ xs:double, xs:double und xs:decimal sind. Darüber hinaus liefern die Funktionen eine leere Sequenz zurück, falls das Argument eine leere Sequenz repräsentiert; wenn die Funktionen auf NaN angewendet werden, wird ein NaN-Wert als Ergebnis zurückgeliefert.

Funktionen und Operatoren auf booleschen Werten

Funktionen und Operatoren auf booleschen Werten werden bereits im Zusammenhang mit der Beschreibung der logischen Ausdrücke in XQuery in Abschnitt behandelt. Die beiden Konstruktorfunktionen fn:true() und fn:false() bilden zusammen mit der durch eine Funktion realisierten Negation fn:not() die Menge von Funktionen auf booleschen Werten. Darüber hinaus stehen für einen Wertevergleich zur Realisierung der =, < und >-Semantik die drei Operatoren op:boolean-equal(), op:boolean-less-than() und op:boolean-greater-than() zur Verfügung. Dabei ist zu beachten, dass false kleiner als true bzw. true größer als false ist, d. h., dass der folgende Ausdruck positiv ausgewertet wird:

where fn:false() < fn:true
and fn:true() > fn:false
and fn:true() = fn:true()
and fn:false() = fn:false()

Bestimmung des effektiven booleschen Wertes

Die Funktion fn:boolean() dient zur Ermittlung des effektiven booleschen Wertes für einen beliebigen Ausdruck und wird implizit bei der Bewertung logischer Ausdrücke, der fn:not()-Funktion, der where-Klausel in einem FLWOR-Ausdruck und bei konditionalen sowie quantifizierenden Ausdrücken angewandt. Die Funktion liefert false, falls der Parameter eine leere Sequenz, den booleschen Wert false, eine leere Ausprägung der Typen xs:string bzw. xdt:untypedAtomic, einen numerischen Wert 0 oder den Wert NaN bei Datentypen xs:double oder xs:float aufweist. Andernfalls liefert die Funktion das Ergebnis true. Zum Beispiel liefert fn:boolean("false") den Wert true, fn:boolean(fn:false()) und fn:boolean(()) jedoch den Wert false. Die Funktion fn:boolean darf nicht mit der Konstruktorfunktion xs:boolean verwechselt werden: Der Aufruf xs:boolean("false") liefert den Wert false.

SignaturBeschreibung
fn:boolean(
$arg as item()*)
as xs:boolean
effektiver boolescher Wert einer beliebigen Sequenz

Tab. Funktion zur Bestimmung des effektiven booleschen Wertes

 

Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)

<< zurückvor >>