Vorige Seite Hauptseite Nächste Seite
In XPath sind Listen grundsätzlich flach. Die Listenkonkatenation
wird mit einem Komma notiert. So ist 1, 2, 3 die
Liste bestehend aus den Elementen 1, 2
und 3. Eine Gruppierung in (1, 2), 3
bezeichnet dieselbe Liste. Eine Liste von Listen von Zeichenketten
ist also wieder eine Liste von Zeichenketten. Ein einziges Element
ist identisch mit der Liste der Länge 1 bestehend aus diesem Element.
|
max zum
Beispiel erwartet ein einziges Argument. Es ist daher unzulässig zu schreiben
max(1,2,5). Die Klammern sind
lediglich anwesend, um die Argumente der Funktion sichtbar zu machen.
Innerhalb des Funktionsausfrufs dient nun das Komma dazu, die Argumente
voneinander zu trennen. Deswegen ist es nötig, noch einmal Klammern zu
setzen, damit klar ist, dass es sich nicht um drei Argumente handelt
sondern um ein einziges, eine Liste:
max((1, 2, 5))
|
exactly-one(L) :
ergibt L, falls
L genau ein Element
enthält, ansonsten bekommen wir eine Fehlermeldung.one-or-more(L) :
ergibt L,
falls L mindestens
ein Element enthält, ansonsten bekommen wir eine Fehlermeldung.zero-or-one(L) :
ergibt L,
falls L höchstens
ein Element enthält, ansonsten bekommen wir eine Fehlermeldung.count, siehe weiter
unten).
Katze,
Hund, Maus. Dabei kann man auch Klammern verwenden:
(Katze, Hund, Maus)
|
to.
Dieser hat folgende Syntax: m to n
, wo m und
n ganze Zahlen bezeichnen.
Das Ergebnis ist die Liste aller ganzen Zahlen, aufsteigend geordnet,
beginnend mit m und
endend mit n.
Ist n kleiner als
n, so ist die Liste leer;
sind die Zahlen gleich, so erhält man eine Liste mit einer einzigen
Zahl.
1 to 5 = 1, 2, 3, 4, 5
|
$ beginnen. So ist zum Beispiel
$wert eine Variable. Dann kann man
schreiben
1 to $wert
|
count(L) : Gibt
die Anzahl der Elemente der Liste.max(L) : Gibt
das größte Element der Liste.min(L) : Gibt
das kleinste Element der Liste.sum(L) : Berechnet
die Summe über alle Elemente der Liste.avg(L) : Berechnet
den Durchschnitt über alle Elemente der Liste.xsl:number bereit. So können
wir uns über den Befehl <xsl:number/>
unmittelbar anzeigen lassen, der wievielte Teilnehmerknoten wir
sind. Alternativ dazu kann man schreiben
count(preceding-sibling::teilnehmer)+1
|
teilnehmer
-Knoten auszusuchen (was man nicht muss, wenn man sicher ist, dass es
nur solche gibt, also könnte wir da auch node()
schreiben) und schließlich 1 hinzuzufügen, weil wir ja
schon an der nächsten Position stehen.
for $i in L return F($i)
|
F(l1),
F(l2),
⋯, F(ln),
|
for $i in 1 to 5 return $i * $i
|
1, 4, 9, 16, 25
|
for $i in 0 to 4 return 1 to $i
|
1, 1, 2, 1, 2, 3, 1, 2, 3, 4
|
$i=0 bekommt man die
leere Liste (der Ausdruck 1 to 0
ist nach dem oben Vereinbarten leer).
Für $i=1 bekommt man
1, für
$i=2 die Liste
1,2, und so weiter.
Mit Hilfe von Klammern sieht das etwa so aus:
(), (1), (1, 2), (1, 2, 3), (1, 2, 3, 4)
|
for Ausdrücke versetzen nicht den Fokus.
Dazu ein Beispiel. Wir wollen die Klausurergebnisse der
Teilnehmer in eine Liste werfen. Der Fokus ist im Knoten
kurs, welcher unter sich alle Teilnehmerknoten
beherbergt. Das Folgende tut nicht das Gewünschte unter der
Annahme, dass die klausur
Knoten jeweils unter dem teilnehmer
Knoten sitzen.
for $i in teilnehmer return klausur
|
for $i in teilnehmer return $i/klausur
|
teilnehmer
ist ein Pfadausdruck und wirft eine Liste von Knoten aus, etwa
k1, k2,⋯,
kn. Für diese wird nun der Ausdruck
berechnet (Fokus ist gleichgeblieben). Hier kommt nun wieder
ein Pfadausdruck, aber dieser ändert sich ständig, weil er
ja von dem gewählten Knoten abhängt. Deswegen steht hier die
Variable $i. Sie
gibt uns den Unterknoten, dh sie erlaubt uns, den Fokus zu versetzen.
Man sehe sich genau den Gebrauch von Variable in Pfadausdrücken an.
some $i in L satisfies B
|
B ist ein Ausdruck,
der für die Listenelemente jeweils einen Wahrheitswert ergeben muss.
Hierbei wird $i in
B vorkommen, muss
es aber nicht. Zum Beispie können wir herausfinden, ob jemand
an der Klausur nicht teilgenommen hat:
some $i in teilnehmer satisfies $i/klausur eq ''
|
teilnehmer[klausur = '']
|
exists (siehe unten).
Damit kommen wir auf das gleiche Ergebnis.
Ebenso gibt es noch den Allquantor
every $i in L satisfies B
|
every $i in L satisfies
|
(every $j in M satisfies B)
|
some $i in L, $j in M satisfies
B
|
exists.
Diese braucht als einziges Argument eine Liste und gibt wahr aus,
wenn diese Liste nicht leer ist.
Es gelten die Gesetze der Logik. Es ist (∀x)χ äquivalent mit
¬(∃x)¬χ. Deswegen kann man den Allquantor wie folgt ersetzen:
not (some $i in L satisfies not (B))
|
for versetzen die
Quantoren den Fokus nicht.
if⋯then
(mit optionalem else),
and und
or. Diese haben die übliche
Bindungsstärke:
and bindet stärker als
or. Zu den Ausdrücken, die
booleschwertig sind gehören numerische Vergleiche, Knotenvergleiche
(zB Abfragen, ob der Wert eines Knotens eine bestimmte Zahl ist) und
so weiter. Pfadausdrücke sind jedoch von anderer Natur!
Ihr Wert ist ja eine Liste von Knoten, deswegen sind
sie nicht als boolesche Werte zu betrachten. Hier muss
man stattdessen die folgenden Operatoren wählen:
union oder
| für
Vereinigung,intersect für Schnitt,except für die Differenz.Vorige Seite Hauptseite Nächste Seite