Mengenoperationen verwenden

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie wollen Sequenzen so verarbeiten, als wären es mathematische Mengen.

Lösung

XPath 1.0

Die Vereinigungsoperation (|) über Knoten wird in XPath 1.0 unterstützt. Um jedoch Durchschnitte und Differenzen von Mengen zu erreichen, müssen wir ein bisschen tricksen.

(: Vereinigung :)

$menge1 | $menge2

(: Durchschnitt :)

$menge1[count(. | $menge2) = count($menge2)]

(: Differenz :)

$menge1[count(. | $menge2) != count($menge2)]

XPath 2.0

Den |-Operator in XPath 2.0 gibt es weiterhin, zusätzlich wurde union jedoch als Alias hinzugefügt. Darüber hinaus gibt es nun intersect und except für Durchschnitt bzw. Mengendifferenz.

(: Vereinigung :)

$menge1 union $menge2

(: Durchschnitt :)

$menge1 intersect $menge2

(: Differenz :)

$menge1 except $menge2

Diskussion

In XPath 2.0 wurden Knotenmengen durch Sequenzen ersetzt. Im Gegensatz zu Knotenmengen sind Sequenzen sortiert und können doppelt auftretende Objekte enthalten. Wenn Sie jedoch die XPath 2.0-Mengenoperationen benutzen, werden Duplikate und Sortierungen ignoriert, sodass sich Sequenzen genauso verhalten wie Mengen. Das Ergebnis einer Mengenoperation wird niemals Duplikate enthalten, selbst wenn dies bei den Eingaben der Fall war!

Der except-Operator wird in einem XPath 2.0-Dialekt zum Auswählen aller Attribute mit Ausnahme einer angegebenen Menge verwendet.

(: Alle Attribute mit Ausnahme von @a. :)

@* except @a

(: Alle Attribute mit Ausnahme von @a und @b. :)

@* except @a, @b

In 1.0 benötigt man dazu die folgenden umständlicheren Ausdrücke:

@*[local-name(.) != 'a' and local-name(.) != 'b']

Interessanterweise erlaubt XPath Mengenoperationen nur über Sequenzen von Knoten. Atomare Werte sind nicht zulässig. Dies liegt daran, dass die Mengenoperationen über die Knotenidentität funktionieren und nicht über den Wert. Mit den folgenden XPath 2.0-Ausdrücken kann man das Ergebnis für Mengen von Werten erzielen. Für XPath 1.0 müssen Sie XSLT-Rekursion verwenden.

(: Vereinigung :)

distinct-values(($objekte1, $objekte2))

(: Durchschnitt :)

distinct-values($objekte1[. = $objekte2])

(: Differenz :)

distinct-values($objekte1[not(. = $objekte2)])

Siehe auch

Die Rezepte Mengenoperationen auf Knotenmengen ausführen und Mengenoperationen auf Knotenmengen mit Hilfe von Wertsemantiken ausführen enthalten weitere Beispiele für Mengenoperationen.

  

<< zurück vor >>

 

 

 

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

Copyright © 2006 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT Kochbuch" 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.

O'Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de