Risposte:
Uso:
(/bookstore/book[@location='US'])[1]
Questo per prima cosa otterrà gli elementi del libro con l'attributo location uguale a "US". Quindi selezionerà il primo nodo da quel set. Nota l'uso delle parentesi, che sono richieste da alcune implementazioni.
Nota, questo non è lo stesso a /bookstore/book[1][@location='US']
meno che il primo elemento non abbia anche quell'attributo location.
/bookstore/book[@location='US'][1]
non restituisce tutti i libri da "US". L'ho testato più volte e con implementazioni xpath di lingue diverse. /bookstore/book[@location='US'][1]
restituisce il primo libro "US" in una libreria. Se ci sono librerie multiple, allora restituirà il primo da ciascuna. Questo è ciò che l'OP ha richiesto (il primo nodo in libreria). La tua versione restituisce un solo libro di tutte le librerie (la prima partita).
/bookstore/book[@location='US'][1]
funziona solo con una struttura semplice.
Aggiungi un po 'più di struttura e le cose si rompono.
Con
<bookstore>
<category>
<book location="US">A1</book>
<book location="FIN">A2</book>
</category>
<category>
<book location="FIN">B1</book>
<book location="US">B2</book>
</category>
</bookstore>
/bookstore/category/book[@location='US'][1]
i rendimenti
<book location="US">A1</book>
<book location="US">B2</book>
non "il primo nodo che corrisponde a una condizione più complicata". /bookstore/category/book[@location='US'][2]
non restituisce nulla.
Con le parentesi puoi ottenere il risultato che la domanda originale era:
(/bookstore/category/book[@location='US'])[1]
dà
<book location="US">A1</book>
e (/bookstore/category/book[@location='US'])[2]
funziona come previsto.
/bookstore/book[1]
e NON (/bookstore/book)[1]
. Il caso che hai fornito non è lo stesso di quello richiesto. Presumibilmente, OP ha accettato la mia risposta in quanto ha fatto ciò che si aspettava (e richiesto).
'(//div[text() = "'+ name +'"])[1]/following-sibling::*/div/text()'
. Nel caso in cui ci siano molte corrispondenze di nodi name
.
Come una spiegazione alla risposta di Jonathan Fingland:
[position()=1 and @location='US']
) devono essere vere nel loro insieme[position()=1][@location='US']
) devono essere vere una dopo l'altra[position()=1][@location='US']
! = [@location='US'][position()=1]
[position()=1 and @location='US']
==[@location='US' and position()=1]
[position()=1]
può essere abbreviato in[1]
È possibile costruire espressioni complesse in predicati con gli operatori booleani " and
" e " or
", e con le funzioni booleane XPath not()
, true()
e false()
. Inoltre puoi racchiudere le sottoespressioni tra parentesi.
Il modo più semplice per trovare il primo nodo di libri in inglese (nell'intero documento), prendendo in considerazione un file XML strutturato più complicato, come:
<bookstore>
<category>
<book location="US">A1</book>
<book location="FIN">A2</book>
</category>
<category>
<book location="FIN">B1</book>
<book location="US">B2</book>
</category>
</bookstore>
è espressione xpath:
/descendant::book[@location='US'][1]
<bookstore>
<book location="US">A1</book>
<category>
<book location="US">B1</book>
<book location="FIN">B2</book>
</category>
<section>
<book location="FIN">C1</book>
<book location="US">C2</book>
</section>
</bookstore>
Quindi, dato quanto sopra; puoi selezionare il primo libro con
(//book[@location='US'])[1]
E questo troverà il primo ovunque che abbia una posizione negli Stati Uniti. [A1]
//book[@location='US']
Restituirebbe il set di nodi con tutti i libri con posizione negli Stati Uniti. [A1, B1, C2]
(//category/book[@location='US'])[1]
Restituirebbe la posizione del primo libro negli Stati Uniti che esiste in una categoria in qualsiasi parte del documento. [B1]
(/bookstore//book[@location='US'])[1]
restituirà il primo libro con la posizione negli Stati Uniti che esiste ovunque sotto la libreria dell'elemento radice; rendendo davvero ridondante la parte / libreria. [A1]
In risposta diretta:
/bookstore/book[@location='US'][1]
Ti restituirà il primo nodo per l'elemento libro con posizione US che è in libreria [A1]
Per inciso, se lo desideri, in questo esempio trovi il primo libro americano che non era un figlio diretto della libreria:
(/bookstore/*//book[@location='US'])[1]
Utilizzare l'indice per ottenere il nodo desiderato se xpath è complicato o più di un nodo è presente con lo stesso xpath.
Es:
(//bookstore[@location = 'US'])[index]
Puoi dare il numero quale nodo vuoi.
per es.
<input b="demo">
E
(input[@b='demo'])[1]
Con l'aiuto di un tester xpath online sto scrivendo questa risposta ...
Per questo:
<table id="t2"><tbody>
<tr><td>123</td><td>other</td></tr>
<tr><td>foo</td><td>columns</td></tr>
<tr><td>bar</td><td>are</td></tr>
<tr><td>xyz</td><td>ignored</td></tr>
</tbody></table>
il seguente xpath:
id("t2") / tbody / tr / td[1]
uscite:
123
foo
bar
xyz
Poiché 1 significa selezionare tutti gli elementi td che sono il primo figlio del proprio genitore diretto.
Ma il seguente xpath:
(id("t2") / tbody / tr / td)[1]
uscite:
123