fn:number

(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: Typkonvertierung

Herkunft: XPath 1.0

Rückgabewert: Eine Zahl vom Typ xs:double (in XPath 1.0 vom Typ number) oder der Wert NaN.

Aufruf/Argumente:

fn:number($eingabewert?)

$eingabewert:
Optional. Ein Knoten oder ein beliebiger atomarer Wert, der in eine Zahl umgewandelt werden soll. Ist der Eingabewert nicht in eine Zahl xs:double konvertierbar, oder handelt es sich um die leere Sequenz, so gibt die Funktion den Wert NaN zurück. Falls kein Argument übergeben wird, arbeitet die Funk­tion mit dem jeweiligen Kontextitem, dessen Wert in eine Zahl xs:double umgewandelt wird. Ist das Kontextitem nicht definiert, wird ein Fehler gemeldet (err:XPDY0002).

Verwendungszweck:

Die Umwandlung eines Ausdrucks in eine Zahl xs:double ist in XPath 2.0 dort erforderlich, wo ein numerischer Eingangs­wert erwartet wird – beispielsweise bei den Rundungsfunktionen. Da keine implizite Typkonvertierung erfolgt, würde ansonsten ein Typfehler gemeldet werden.

Mittels fn:number() kann sichergestellt werden, dass der in Frage kommende Wert entweder umgewandelt werden kann oder stattdessen der Wert NaN übergeben wird, der aber (als numerischer Wert) keinen Typfehler verursacht.

In XPath 1.0 erfolgt eine Typkonversion hingegen implizit, wenn der Ausdruck in einem Kontext verwendet wird, in dem nur Zahlen zulässig sind. Man benö­tigt dort die Funktion number() daher normalerweise nur in solchen Fällen, in denen die implizite Umwandlung nicht zuverlässig stattfindet, also im Predi­cate eines XPath-Ausdrucks.

Verhalten in XPath 2.0:

Bei expliziter oder impliziter Anwendung von fn:number() wird in XPath 2.0 zwischen drei Gruppen von Eingabewerten unterschieden: 

Eingabewert ist (direkt) ein atomarer Wert
Grundsätzlich muss der atomare Eingabewert lexikalisch einer Zahl xs:double entsprechen. Dies ist trivialer­weise der Fall für alle Zahlentypen.

Strings sind umwandelbar, wenn sie aus Ziffern (eventuell mit Vorzeichen und Dezimalpunkt) oder (in beliebiger Groß-/Kleinschreibweise) den Zeichenfolgen 'inf', '-inf', 'NaN' bestehen.

Der boolesche Wert true wird in 1.0, der Wert false in 0.0 umgewandelt.

Für alle anderen atomaren Typen, also Datumswerte, Zeitdauern etc., ist eine Umwandlung nicht möglich. Für sie gibt fn:number() ebenso wie für Strings, die lexikalisch nicht den Anforderungen entsprechen, den Wert NaN zurück.

Eingabewert ist ein Node mit atomarem Wert
Der atomare Wert des Kno­tens wird nach den oben aufgeführten Regeln in eine Zahl xs:double umge­wandelt. Ist die Umwandlung nicht möglich, so gibt die Funktion NaN zurück.

Eingabewert ist ein Node mit nicht atomarem Wert
Der nicht atomare Wert des Knotens wird zunächst, analog zur Verwendung von fn:string(), in einen String umgewandelt. Anschließend wird versucht, den Ergebnisstring dieser Operation gemäß den oben angeführten Regeln in eine Zahl xs:double umzuwandeln. Schlägt die Umwandlung fehl, entspricht der String also lexikalisch nicht einer Zahl, so gibt die Funktion auch in diesem Fall NaN zurück.

Verhalten in XPath 1.0:

Bei expliziter oder impliziter Anwendung von number() ergeben sich für ver­schiedene Datentypen folgende Rückgabewerte:

Number
Ist der Eingabewert bereits eine Zahl, so bleibt er unverändert.

Boolean
Ist der Eingabewert ein boolescher Wert, so gibt die Funktion die Zahl 1 für den Eingabewert true und die Zahl 0 für den Eingabewert false zurück.

String
Ist der Eingabewert ein leerer oder nicht leerer String, so liefert die Funktion den Wert NaN (Not a Number) zurück. Es sei denn, der String besteht aus einer nicht unterbrochenen Folge von Ziffern mit maximal einem Dezimal­punkt und maximal einem unmittelbar(!) vorangestellten Minuszeichen. In die­sem Fall wird die der Ziffernfolge entsprechende, positive oder negative Dezi­malzahl zurückgegeben. Der Ziffernstring darf führende und folgende Whitespace-Zeichen besitzen, die bei der Umwandlung durch Normalisierung wie mit normalize-space() entfernt werden.

Nodeset
Ein Nodeset wird zunächst implizit durch die Anwendung von string() in eine Zeichenkette umgewandelt. Dieser String entspricht dem Textvalue des Nodesets bzw. ergibt für einen leeren Nodeset den leeren String. Die auf diesen Zwischenschritt folgende Anwendung von number() entspricht der oben für Strings beschriebenen.

Verwendung in einem XPath-Predicate:
Soll der Wert eines Ausdrucks im Rahmen eines XPath-Predicates, etwa für den Vergleich der Position des Kontextknotens mit der des Current Nodes, als Zahl interpretiert werden, so sollte er vorsorglich explizit mittels der Funktion fn:number() umgewandelt werden:

beispiel[fn:position() = fn:number($ausdruck)]

wobei Elemente <beispiel> ausgewählt werden, deren Position in einem Nodeset dem Zahlenwert von $ausdruck entspricht.

Beispiele:

Funktionsaufruf Ergebnis

fn:number(true)

1.0

fn:number(-3.895)

-3.895

fn:number('1.63')

1.63

fn:number('-1.63')
Anmerkung: Vorzeichen sind erlaubt!

-1.63

fn:number('   -1.63  ')
Anmerkung: Führende Leerzeichen sind erlaubt!

-1.63

fn:number(' -  1.63')
Anmerkung: Leerzeichen im Wert sind verboten!

NaN

fn:number('jeder String')

NaN

fn:number('') 
Anmerkung: Der leere String ist auch ein String!

NaN

Tabelle: Ergebnisse des Aufrufs von fn:number() mit verschiedenen Werten.

Funktionsdefinition:

XPath 1.0:

number(object?)=> number

XPath 2.0:

fn:number() as xs:double

fn:number($arg as xs:anyAtomicType?) as xs:double

Mögliche Kompatibilitätsprobleme XPath 2.0 zu XPath 1.0:
Die XPath 2.0-Funktion fn:number() versucht, den Eingabewert in eine Zahl vom Typ xs:double umzuwandeln. Sie liefert daher für die booleschen Werte true und false die Zahlen 1.0 respektive 0.0 zurück, in XPath 1.0 dagegen die Zahlen 1 und 0. Bei Fehlschlag der Umwandlung (Typfehler: »invalid lexical value«) gibt sie im Fehlerfall wie in XPath 1.0 den Wert NaN zurück, genauer den xs:double-Wert NaN.

   

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