Die Filterung einer Sequenz

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 2.)

Prüfung auf Existenz eines Attributs oder Kindelements

Ein simples Predicate prüft auf das Vorhandensein eines Kindelements oder eines Attributs, ohne dessen konkreten Wert zu berücksichtigen. So wählt

select="beispiel[test]"

alle Elementknoten <beispiel>, die ein Kindelement <test> besitzen, unab­hängig von dessen Inhalt. Analog ist dies für Attributknoten möglich:

<xsl:apply-templates select="buch[@kat]"/>

wählt alle Bücher in unserem Beispiel, die über ein kat-Attribut verfügen. In diesem Falle nützt dies als Filterbedingung konkret nichts, da für das Attribut ein Default-Wert vereinbart ist, und es, selbst wenn es im Quelldokument fak­tisch fehlt, durch den XML-Parser ergänzt wird. Da dies jedoch geschieht, bevor der XSLT-Prozessor das Predicate prüft, ist für diesen ein real im Quelltext vor­handenes und ein virtuell eingefügtes Default-Attribut nicht unterscheidbar.

Prüfung auf Gleichheit und Ungleichheit mit konkretem Wert

Soll beispielsweise eine Liste aller Bücher erstellt werden, deren Preis in Dollar angegeben wurde, so kann dies einfach bei der Zusammenstellung der Sequenz geschehen (Current Node sei das Wurzelelement <buchhandel>):

<xsl:apply-templates select="buch[preis/@waehrung='Dollar']"/>

Das Predicate enthält einen XPath-Ausdruck, dessen Auswertung für jeden Knoten der Resultatsequenz des Steps einen Booleschen Wert ergibt: Ein Buch besitzt entweder ein Kindelement <preis>, das über ein waehrung-Attribut mit dem Wert "Dollar" verfügt – dann verbleibt es in der Sequenz –, oder das Attribut hat einen anderen Wert (bzw. existiert nicht), woraufhin der entsprechende Knoten verworfen wird. Geprüft werden aber alle Bücher.

Achtung:
Da der gesamte XPath-Ausdruck in doppelten Anführungszeichen steht, muss als Stringbegrenzer des Attributwerts innerhalb des Predicates das einfache Anführungszeichen verwendet werden:

buch[buchverlag='Ozean Verlag']

Triviale Prüfung auf Position in der Sequenz

Die Items einer Sequenz sind ihrer Reihenfolge entsprechend durchnumme­riert, also über einen Index ansprechbar bzw. beschreibbar. Der Index beginnt immer bei 1 für das erste Item. Eine Indexziffer kann direkt als Filterkriterium verwendet werden. Hierfür wird die entsprechende Ganzzahl als Predicate-Ausdruck eingesetzt. So lässt

buch[1]

aus der Sequenz aller Buchelemente, die der Knotentest zusammenstellt, nur das erste Item passieren, in diesem Fall also das erste Buch in Dokumentrei­henfolge. Ein solcher Ausdruck ist auch im Inneren eines anderen Predicate-Ausdrucks möglich: Sollten Sie beispielsweise den Namensvergleich auf das erste <buchautor>-Element beschränken müssen (ein möglicher Grund hierfür wird später gezeigt), so können Sie

buch[buchautor[1]='Lyon, Matthew']

schreiben, was nur die Bücher durchlässt, für die Matthew Lyon im jeweils ers­ten <buchautor>-Element genannt wird (im betrachteten Fall ist er Co-Autor eines Buchs, also an zweiter Stelle erwähnt – die Ergebnissequenz ist also leer).

Bei dieser Form des Predicates darf nur genau eine Ganzzahl xs:integer über­geben werden. Der Versuch, mit Hilfe zweier gleichzeitig übergebener Index­zahlen – etwa in der Form beispiel[1 3] – mehrere konkrete Items zu wäh­len, scheitert (Syntaxfehler). Ebensowenig funktioniert die Übergabe einer Sequenz aus Ganzzahlen, wie sie mit einem Ausdruck 2 to 5 erzeugt würde: Dieser Ausdruck ergibt in der Tat die Sequenz (2, 3, 4, 5), leider jedoch wählt beispiel[2 to 5] nicht das »zweite bis fünfte« Item aus (eine Lösung hierfür wird auf den folgenden Seiten gezeigt), sondern lässt alle Items passieren, ohne überhaupt zu filtern!

Der Grund besteht darin, dass eine übergebene Sequenz, sobald sie nicht leer ist, stets den Booleschen Wert true ergibt. Einen Syntaxfehler stellt dies nicht dar; die Übergabe einer Sequenz ist prinzipiell erlaubt, lediglich wenig sinn­voll.

Wertvergleich – kleiner und größer

In einem Predicate kann auch ein Vergleich auf »größer als« oder »kleiner als« stattfinden. Die Operatorsymbole > und < können allerdings im Stylesheet nicht direkt eingesetzt werden, da der XML-Parser diese als Elementbegrenzer missverstehen würde. Man verwendet deshalb die Entities &gt; und &lt;.

Der XML-Parser ersetzt die Entities, bevor der XSLT-Prozessor sich an die Arbeit macht. Dieser findet daher die richtigen Symbole vor.

Sollen nur vor dem Jahr 2000 erschienene Bücher ausgegeben werden, so schreibt man:

select="buch[@ersch-jahr &lt; '2000']"

   

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