XPath può restituire solo nodi che hanno un figlio di X?
Domanda
È possibile utilizzare XPath per selezionare solo i nodi con elementi figlio specifici? Ad esempio, da questo XML voglio solo gli elementi negli animali domestici che hanno un figlio di "bar". Quindi il set di dati risultante conterrebbe gli elementi lizard
e pig
da questo esempio:
<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>
Questo Xpath mi dà tutti gli animali domestici: " / pets / * "
, ma voglio solo gli animali domestici che hanno un nodo figlio di nome 'bar'
.
Soluzione
Eccolo, in tutto il suo splendore
/pets/*[bar]
Inglese: dammi tutti i figli di animali
che hanno un figlio bar
Altri suggerimenti
/pets/child::*[child::bar]
Scusa, non ho visto i commenti alla risposta precedente.
Ma in questo caso preferirei usare l'asse descendant ::
, che include tutti gli elementi in giù rispetto a specificato:
/pets[descendant::bar]
Nel caso in cui volessi essere più specifico sui bambini, puoi anche usare selettori su di essi.
Esempio:
<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>
Ora ti preoccupi solo di tutti animali
che hanno una barra
che ha un attributo att
con valore baz
. Puoi usare la seguente espressione xpath:
//pets/*[descendant::bar[@att='baz']]
Risultato
<lizard>
<bar att="baz">lizard should be returned, because it has a child of bar</bar>
</lizard>