Ответ 1
Вот он во всей красе
/pets/*[bar]
Русский: Дайте мне всех детей pets
, у которых есть ребенок bar
Можно ли использовать XPath для выбора только узлов, которые имеют определенные дочерние элементы? Например, из этого XML я хочу только элементы в домашних животных, у которых есть ребенок из "бара". Таким образом, результирующий набор данных будет содержать элементы 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/*"
, но я хочу только домашних животных, у которых есть ребенок node имени '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>