Holen Sie sich das n-te Kind eines Knotens mit xpath

74

Mein Beispiel für eine Eingabe-XML lautet:

<root>
 <a>
   <b>item</b>
   <b>item1</b>
   <b>item2</b>
   <b>item3</b>
   <b>item4</b>
 </a>
</root>

Ich nehme an, einen Knoten auszuwählen, bdessen Position der Wert einer Variablen ist.

Wie kann ich den Wert einer Variablen verwenden, um die Position eines Knotens zu testen?

IordanTanev
quelle

Antworten:

95

Sie können dies verwenden:

/root/a/b[position()=$variable]

position () basiert auf 1

http://saxon.sourceforge.net/saxon6.5.3/expressions.html

Remi Bourgarel
quelle
11
Denken Sie daran, dass es nicht 0-indiziert ist. Ich habe gerade 2 Stunden damit verbracht, meine Zeit damit zu verschwenden, nach etwas auf Position 0 zu suchen.
Bürger conn
54

Folgendes sollte funktionieren:

/root/a/b[2]

Und wenn nicht, versuchen Sie:

/root/a/b[position()=2]
Ronald Wildenberg
quelle
1
Ich bin hierher gekommen, um den Unterschied zwischen diesen beiden herauszufinden. Könnten Sie bitte erklären, wie sie sich unterscheiden?
Andre
11
position()bezieht sich auf die Position im dom [2] bezieht sich auf das zweite Ergebnis in der Ergebnisliste.
Becky Conning
2
@ Andrew. Wenn sie in einer for-eachSchleifenanweisung verwendet selectwerden, sind sie gleich. Wenn position()es innerhalb der Schleife selbst verwendet wird, bezieht es sich auf die Ergebnismenge. Das [n]Format funktioniert nur als Kurzform, da es die einzige Bedingung innerhalb des [ ]Blocks ist, andernfalls position()muss wie in //a[(@id="xx") and (position()=3)]"jeder fünfte Link mit einem idvon xx" verwendet werden.
Patanjali
@Patanjali Das ist verwirrend - Links mit der Position () von 3 sind die 5. Links? Es scheint mir, dass [2] anstelle von: n-tem Typ (2) verwendet werden könnte, während [position () = 2] das Äquivalent von: n-tem Kind (2) wäre. Ich denke, wir brauchen ein paar Beispiele, um den Nebel zu beseitigen.
Bitoolean
@Patanjali Ich glaube, ich habe den Teil verstanden, dass es eine Abkürzung ist, nachdem ich es getestet habe, und es gibt mir nur das "item1", indem ich \\*[2]und \\*[position()=2]gegen das XML der Frage laufe . Vielen Dank!
Bitoolean