Can XPath retornar apenas nós que têm um filho de X?
Pergunta
É possível usar XPath para selecionar apenas os nós que têm uma determinada elementos filhos? Por exemplo, a partir deste XML Eu só quero que os elementos em animais de estimação que têm uma criança de 'bar'. Assim, o conjunto de dados resultante contém os elementos lizard
e pig
a partir deste exemplo:
<pets>
<cat>
<foo>don't care about this</foo>
</cat>
<dog>
<foo>not this one either</foo>
</dog>
<lizard>
<bar>lizard should be returned, because it has a child of bar</bar>
</lizard>
<pig>
<bar>return pig, too</bar>
</pig>
</pets>
Este XPath me dá todos os animais de estimação:. "/pets/*"
, mas eu só quero os animais de estimação que têm um nó filho de nome 'bar'
Solução
Aqui está, em toda sua glória
/pets/*[bar]
Inglês: Dê-me todos os filhos de pets
que têm um bar
criança
Outras dicas
/pets/child::*[child::bar]
O meu perdão, eu não vi os comentários para a resposta anterior.
Mas neste caso eu prefiro preferem usar o eixo descendant::
, que inclui todos os elementos para baixo do especificado:
/pets[descendant::bar]
Apenas no caso você quis ser mais específico sobre as crianças -. Você também pode usar seletores sobre eles
Exemplo:
<pets>
<cat>
<foo>don't care about this</foo>
</cat>
<dog>
<foo>not this one either</foo>
</dog>
<lizard>
<bar att="baz">lizard should be returned, because it has a child of bar</bar>
</lizard>
<pig>
<bar>don't return pig - it has no att=bar </bar>
</pig>
</pets>
Agora, você só se preocupam com tudo pets
ter qualquer bar
criança que tem um att
atributo com valor baz
. Você pode usar a seguinte expressão XPath:
//pets/*[descendant::bar[@att='baz']]
Resultado
<lizard>
<bar att="baz">lizard should be returned, because it has a child of bar</bar>
</lizard>