Может ли XPath возвращать только узлы, у которых есть дочерний элемент X? - PullRequest
33 голосов
/ 20 сентября 2008

Можно ли использовать XPath для выбора только тех узлов, которые имеют определенные дочерние элементы? Например, из этого XML я хочу только элементы в домашних животных, у которых есть дочерний элемент '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/*", но я хочу только питомцев, у которых есть дочерний узел с именем 'bar'.

Ответы [ 3 ]

49 голосов
/ 20 сентября 2008

Вот оно, во всей красе

/pets/*[bar]

Английский: дай мне всех детей pets, у которых есть ребенок bar

23 голосов
/ 11 января 2009
/pets/child::*[child::bar]

Прошу прощения, я не видел комментариев к предыдущему ответу.

Но в этом случае я бы предпочел использовать ось descendant::, которая включает все элементы ниже указанного:

/pets[descendant::bar]
4 голосов
/ 10 сентября 2014

На всякий случай, если вы хотите быть более конкретным в отношении детей - вы также можете использовать селекторы для них.

Пример:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...