Может ли XPath возвращать только узлы, у которых есть дочерний элемент X?

StackOverflow https://stackoverflow.com/questions/105613

  •  01-07-2019
  •  | 
  •  

Вопрос

Можно ли использовать 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top