Tenho o seguinte documento:
<a>
<bb>abc</bb>
<cc>ccc</cc>
<dd>ddd</dd>
</a>
<a>
<bb>zz</bb>
<cc>1</cc>
<dd>2</dd>
</a>
Como posso obter o valor de <cc>
usar XPath se <bb>
for zz
?
Tenho o seguinte documento:
<a>
<bb>abc</bb>
<cc>ccc</cc>
<dd>ddd</dd>
</a>
<a>
<bb>zz</bb>
<cc>1</cc>
<dd>2</dd>
</a>
Como posso obter o valor de <cc>
usar XPath se <bb>
for zz
?
Respostas:
Não tenho certeza de por que todo mundo está procurando por irmãos, você também pode verificar se há <bb/>
elementos correspondentes ao predicado de <a/>
:
//a[bb/text() = "zz"]/cc/text()
*-sibling
eixo. 1 embora.
O que você precisa é do following-sibling
eixo XPath
//a/bb[text()="zz"]/following-sibling::cc[1]/text()
Teste o Xpath aqui: http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625
P: Como selecionar um nó usando XPath se o nó irmão tiver um valor específico?
Como há apenas "eixos XPath" para irmãos seguintes e irmãos anteriores, você pode usar um deles se a posição for fixa.
Mas melhor:
procure cc
onde os pais têm filhos bb
com valor 'zz'
:
//cc[../bb='zz']
//a[bb = 'zz']/cc
.
Primeiro, seu exemplo não é um XML bem formado. Passando por cima disso e de que você não descreveu muito bem suas intenções (o que exatamente você deseja selecionar e em que condição?), Presumo que queira fazer isso:
//cc[preceding-sibling::bb[text()="zz"]]/text()
Seleciona
TEXT VALUES OF ALL <CC> ELEMENTS
//cc /text()
THAT HAVE A PRECEDING SIBLING <BB>
[preceding-sibling::bb ]
THAT HAS TEXT VALUE EQUAL TO "zz"
[text()="zz"]
Você poderia escrever também é como
//bb[text()="zz"]/following-sibling::cc/text()
Por favor, olhe as especificações , tem alguns exemplos muito bem legíveis com os quais você aprenderá muito.
//a/cc[../bb='zz']/text()
// a: Seleciona todos os elementos 'a', não importa onde estejam.
// a / cc: Seleciona os elementos 'cc' que são filhos do elemento 'a' (não importa onde a esteja).
..: Seleciona o pai do nó atual.
[../bb='zz ']: onde o valor do elemento irmão' bb 'é zz.
Referência: http://www.w3schools.com/xsl/xpath_syntax.asp
Outra solução para este problema é
//bb[contains(.,'zz')]/../cc/text()
Explicação : Qualquer um bb
que contenha 'zz'
string em todos os nós filhos do bb
então indo para o nó pai desse bb
uso ..
, agora que podemos acessar o cc
texto de retorno.
Espero que essa explicação não seja complexa.