Mit Sequenzen arbeiten

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie wollen Sammlungen beliebiger Knoten und atomarer Werte manipulieren, die aus einem oder mehreren XML-Dokumenten abgeleitet wurden.

Lösung

XPath 1.0

In XPath 1.0 gibt es das Konzept der Sequenz nicht, daher sind diese Rezepte zum größten Teil nicht anwendbar. XPath 1.0 besitzt Knotenmengen. Es gibt eine idiomatische Methode, mittels XSLT 1.0 leere Knotenmengen zu erzeugen.

(: Die leere Knotenmenge :)

/..

XPath 2.0

(: Konstruktor für eine leere Sequenz. :)

( )

(: Eine Sequenz, die aus einem einzelnen atomaren Objekt 1 besteht. :)

1

(: Verwenden Sie den Komma-Operator, um eine Sequenz zu konstruieren. Hier bauen wir eine Sequenz aller X-Kinder des Kontexts, gefolgt von den Y-Kindern, gefolgt von den Z-Kindern. :)

X, Y, Z

(: Verwenden Sie den to-Operator, um Bereiche zu konstruieren. :)

1 to 10

(: Hier kombinieren wir das Komma mit mehreren Bereichen. :)

1 to 10, 100 to 110, 17, 19, 23

(: Variablen und Funktionen können ebenfalls verwendet werden. :)

1 to $x

1 to count(para)

(: Sequenzen werden nicht geschachtelt, die folgenden beiden Sequenzen sind daher identisch. :)

((1,2,3), (4,5, (6,7), 8, 9, 10))

1,2,3,4,5,6,7,8,9,10

(: Der to-Operator kann nicht direkt eine absteigende Sequenz erzeugen. :)

10 to 1 (: Diese Sequenz ist leer! :)

(: Folgendermaßen können Sie den gewünschten Effekt erzielen. :)

for $n in 1 to 10 return 11 - $n

(: Entfernen von Duplikaten aus einer Sequenz. :)

distinct-values($seq)

(: Rückgabe der Größe einer Sequenz. :)

count($seq)

(: Testen, ob eine Sequenz leer ist. :)

empty($seq) (: dies ist count($seq) eq 0 vorzuziehen :)

(: Ermitteln der Positionen eines Objekts in einer Sequenz. Index-of erzeugt eine Sequenz aus Integer-Werten für jedes Objekt im ersten Argument, das gleich dem zweiten ist. :)

index-of($seq, $item)

(: Extrahieren von Teilsequenzen. :) (: Bis zu 3 Objekte aus $seq, beginnend mit dem zweiten. :)

subsequence($seq, 2, 3)

(: Alle Objekte aus $seq an Position 3 bis zum Ende der Sequenz. :)

subsequence($seq, 3)

(: Einfügen einer Sequenz, $seq2, vor dem dritten Objekt in einer Eingabesequenz $seq1. :)

insert-before($seq1, 3, $seq2)

(: Konstruieren einer neuen Sequenz, die alle Objekte von $seq mit Ausnahme des dritten enthält. :)

remove($seq1, 3)

(: Falls Sie mehrere Elemente entfernen müssen, könnten Sie einen solchen Ausdruck in Betracht ziehen. :)

$seq1[not(position( ) = (1,3,5))]

$seq1[position( ) gt 3 and position( ) lt 7]

Diskussion

In XPath 2.0 ist jedes Datenobjekt (Wert) eine Sequenz. Das bedeutet, dass der atomare Wert 1 genauso eine Sequenz ist wie das Ergebnis des Ausdrucks (1 to 10). Anders ausgedrückt wird jeder XPath 2.0-Ausdruck zu einer Sequenz ausgewertet. Eine Sequenz kann null oder mehrere Werte enthalten, bei diesen Werten kann es sich um Knoten, atomare Werte oder um eine Mischung aus beidem handeln. Beim Vergleich von Sequenzen ist die Reihenfolge wichtig. Sie referenzieren die einzelnen Objekte einer Sequenz beginnend bei der Position 1 (nicht 0, wie jemand mit einem C/Java-Hintergrund vermuten könnte).

XPath 1.0 kennt Sequenzen nicht, hat aber dafür Knotenmengen. Das Konzept der Knotenmengen ist nicht so ordentlich wie das der Sequenzen, in vielen Fällen ist die Unterscheidung jedoch irrelevant. Beispielsweise sollte sich jeder XPath 1.0-Ausdruck, der die Funktionen count() und empty() verwendet, genauso verhalten wie in 2.0. Der Vorteil von XPath 2.0 besteht darin, dass eine Sequenz ein erstklassiges Konstrukt ist, das mit Hilfe einer Vielzahl neuer Funktionen aus XPath 2.0 konstruiert und manipuliert werden kann. Die Rezepte in diesem Abschnitt führen viele wichtige Sequenz-Idiome ein, weitere werden Ihnen in den verschiedenen Rezepten dieses Buches begegnen.

  

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