Respostas:
Usar:
(/bookstore/book[@location='US'])[1]
Primeiro, os elementos do livro com o atributo de localização são iguais a 'US'. Em seguida, ele selecionará o primeiro nó desse conjunto. Observe o uso de parênteses, que são exigidos por algumas implementações.
Observe que isso não é o mesmo que /bookstore/book[1][@location='US']
, a menos que o primeiro elemento também possua esse atributo de local.
/bookstore/book[@location='US'][1]
não retorna todos os livros de 'US'. Eu testei várias vezes e em implementações xpath de idiomas diferentes. /bookstore/book[@location='US'][1]
retorna o primeiro livro dos EUA em uma livraria. Se houver várias livrarias, ele retornará a primeira de cada uma. Foi isso que o OP solicitou (o primeiro nó na livraria). Sua versão retorna apenas um livro de todas as livrarias (a primeira correspondência).
/bookstore/book[@location='US'][1]
funciona apenas com estrutura simples.
Adicione um pouco mais de estrutura e as coisas quebram.
Com
<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]
rendimentos
<book location="US">A1</book>
<book location="US">B2</book>
não "o primeiro nó que corresponde a uma condição mais complicada". /bookstore/category/book[@location='US'][2]
não retorna nada.
Com parênteses, você pode obter o resultado da pergunta original:
(/bookstore/category/book[@location='US'])[1]
dá
<book location="US">A1</book>
e (/bookstore/category/book[@location='US'])[2]
funciona como esperado.
/bookstore/book[1]
e NÃO (/bookstore/book)[1]
. O caso que você forneceu não é o mesmo que o OP pediu. Presumivelmente, o OP aceitou minha resposta, como fez o que ele esperava (e solicitou).
'(//div[text() = "'+ name +'"])[1]/following-sibling::*/div/text()'
. Caso haja muitas correspondências de nós name
.
Como explicação para a resposta de Jonathan Fingland:
[position()=1 and @location='US']
) devem ser verdadeiras como um todo[position()=1][@location='US']
) devem ser verdadeiras uma após a outra[position()=1][@location='US']
! = [@location='US'][position()=1]
[position()=1 and @location='US']
==[@location='US' and position()=1]
[position()=1]
pode ser abreviado para[1]
Você pode criar expressões complexas em predicados com os operadores booleanos " and
" e " or
" e com as funções booleanas XPath not()
, true()
e false()
. Além disso, você pode agrupar sub-expressões entre parênteses.
A maneira mais fácil de encontrar o primeiro nó do livro em inglês (em todo o documento), levando em consideração o arquivo xml estruturado mais complicado, como:
<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>
é a expressão 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>
Dado o exposto; você pode selecionar o primeiro livro com
(//book[@location='US'])[1]
E este encontrará o primeiro em qualquer lugar que tenha uma localização nos EUA. [A1]
//book[@location='US']
Retornaria o conjunto de nós com todos os livros com o local US. [A1, B1, C2]
(//category/book[@location='US'])[1]
Retornaria o primeiro local do livro nos EUA que existe em uma categoria em qualquer lugar do documento. [B1]
(/bookstore//book[@location='US'])[1]
retornará o primeiro livro com o local US que existe em qualquer lugar na livraria de elementos raiz; tornando a livraria / parte realmente redundante. [A1]
Em resposta direta:
/bookstore/book[@location='US'][1]
Retornará o primeiro nó para o elemento do livro com o local US que está na livraria [A1]
Aliás, se você quisesse, neste exemplo, encontre o primeiro livro dos EUA que não era filho direto da livraria:
(/bookstore/*//book[@location='US'])[1]
Use o índice para obter o nó desejado se o xpath for complicado ou se houver mais de um nó com o mesmo xpath.
Ex:
(//bookstore[@location = 'US'])[index]
Você pode dar o número que nó deseja.
por ex.
<input b="demo">
E
(input[@b='demo'])[1]
Com a ajuda de um testador online do xpath , estou escrevendo esta resposta ...
Para isso:
<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>
o seguinte xpath:
id("t2") / tbody / tr / td[1]
saídas:
123
foo
bar
xyz
Como 1 significa selecionar todos os elementos td que são o primeiro filho de seu próprio pai direto.
Mas o seguinte xpath:
(id("t2") / tbody / tr / td)[1]
saídas:
123