Может ли XPath возвращать только узлы, у которых есть дочерний элемент X?
Вопрос
Можно ли использовать XPath для выбора только тех узлов, у которых есть определенные дочерние элементы?Например, из этого XML мне нужны только элементы в pets, у которых есть дочерний элемент 'bar'.Таким образом, результирующий набор данных будет содержать lizard
и pig
элементы из этого примера:
<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>
Этот Xpath дает мне всех домашних животных: "/pets/*"
, но мне нужны только домашние животные , у которых есть дочерний узел name 'bar'
.
Решение
Вот оно, во всей своей красе
/pets/*[bar]
Английский:Отдай мне всех детей pets
у которых есть ребенок bar
Другие советы
/pets/child::*[child::bar]
Прошу прощения, я не видел комментариев к предыдущему ответу.
Но в данном случае я бы предпочел использовать descendant::
ось, которая включает в себя все элементы, расположенные ниже указанной:
/pets[descendant::bar]
На всякий случай, если вы хотите уточнить информацию о дочерних элементах - вы также можете использовать для них селекторы.
Пример:
<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>
Теперь ты заботишься только обо всех pets
иметь любого ребенка bar
у этого есть атрибут att
со значением baz
.Вы можете использовать следующее выражение xpath:
//pets/*[descendant::bar[@att='baz']]
Результат
<lizard>
<bar att="baz">lizard should be returned, because it has a child of bar</bar>
</lizard>