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'

Foi útil?

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top