fn:distinct-values

(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: Funktionen für Sequenzen

Herkunft: XPath 2.0

Rückgabewert: Eine Sequenz, generiert aus einer Eingabesequenz bestehend aus Items atomaren Typs durch Entfernung von Dubletten gleichen Wertes

Aufruf/Argumente:

fn:distinct-values($eingabesequenz, $collation-URI?)

$eingabesequenz:
Das Eingabeargument muss eine aus Items atomaren Typs zusammengesetzte Sequenz sein, aus der doppelt vorhandene Werte entfernt werden sollen. Ist die Eingangssequenz leer, so gibt die Funktion die leere Sequenz zurück.

$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. Ist dies nicht der Fall, wird eine Fehlermeldung ausgegeben (»Invalid collationURI«). Wird kein zwei­tes Argument übergeben, so wird für Vergleiche von Stringwerten die Default-Collation herangezogen. Sind in den zu vergleichenden Sequenzen keine Items vom Typ xs:string enthalten, so wird das Collation-Argument ignoriert.

Verwendungszweck:

Aus einer Eingabesequenz werden bis auf jeweils eine alle Dubletten derjenigen Werte entfernt, die auf Grund der Anwendung des eq-Operators als gleich erkannt wurden. Die verbleibenden Werte erschei­nen in der ursprünglichen Reihenfolge (sequence order) in der Ausgabese­quenz. Ist die Eingabesequenz leer, so ist in Folge auch die Ausgabesequenz leer.

Die Werte der Eingabesequenz müssen in einer Form (bezeichnet als total order) vorliegen, die ihre Vergleichbarkeit gewährleistet. Im Wesentlichen bedeutet dies, dass es für zwei Größen, die als ungleich erkannt wurden, fest­stellbar 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 entsprechenden Typen zugelassen sind.

Vergleich untypisierter atomarer Werte
Untypisierte atomare Werte vom Typ xs:untypedAtomic werden verglichen, als ob sie vom Typ xs:string wären.

Vergleich numerischer Werte
Die Typgleichheit numerischer Werte wird gegebenenfalls durch Typ-Promotion (Umwandlung in einen übergeordneten numerischen Typ) hergestellt. Für Sequenzen aus Werten vom Typ xs:float und xs:double werden NaN-Werte als gleich betrachtet (dies steht im Gegen­satz zu den sonstigen Gepflogenheiten!). Sind in der Eingangssequenz daher mehrere NaN-Werte enthalten, so wird von ihnen nur einer zurückgegeben. Ebenso gelten die Werte +0.0 (positiv Null) und -0.0 (negativ Null) in diesem Zusammenhang als gleich. (Genauer gesagt gibt es in XPath grundsätzlich keine Möglichkeit, zwischen +0 und -0 zu unterscheiden!)

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 Zeitzonenangabe. Besitzt ein derartiger Wert eine entsprechende Angabe nicht, so wird die implizite Zeitzonenangabe hinzuge­fügt, wie sie sich aus dem Bewertungskontext ergibt. Der Datums- oder Zeit­wert wird – falls erforderlich – auf dieser Grundlage normalisiert und in dieser Form für die Vergleiche herangezogen. Unterscheiden sich zwei Werte nur anhand ihrer Zeitzonenangabe, ist es der Implementation überlassen, welcher der beiden Werte erhalten bleibt.

Vergleich von Zeichenketten
Die Gleichheit von Zeichenketten xs:string wird anhand einer Collation bestimmt. Hierbei findet entweder die Default-Colla­tion oder die durch das zweite Funktionsargument bestimmte Collation Ver­wendung. Wurde eine Collation angegeben, sind die Items der Ein­gabesequenz jedoch nicht vom Typ xs:string, so wird die Angabe der Collation ignoriert.

Beispiele:

Beispiel 1 – Dopplung einer Zahl in einer Sequenz:

fn:distinct-values((1, 2.0, 3, 2))

ergibt

(1, 2, 3)

Anmerkung: Andere Applikationen können hier andere Ergebnisreihenfolgen, wie bei­spielsweise (1, 3, 2.0) ausgeben.

Beispiel 2 – Dopplung eines Stringwerts in einer Sequenz:

fn:distinct-values(('abc','bcd','def','abc','efg'))

ergibt

('abc', 'bcd', 'def', 'efg')

Beispiel 3 – Positiv und negativ Null in der Eingangssequenz:

fn:distinct-values((+0.0, -0.0))

ergibt 0 (d.h. die Null-Werte werden als gleich betrachtet)

Anmerkung: Die Spezifikation legt das Verhalten in diesem Fall nicht fest.

Funktionsdefinition:

XPath 1.0:

Funktion nicht verfügbar

XPath 2.0:

fn:distinct-values($arg as xs:anyAtomicType*)
                   as xs:anyAtomicType*

fn:distinct-values($arg as xs:anyAtomicType*,
                   $collationLiteral as xs:string)
                   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