XPath для выбора родителя, содержащего только определенные c типы детей? - PullRequest
2 голосов
/ 18 июня 2020

У меня есть этот простой DOM:

<r>
  <a1>
    <foo>...</foo>
    <foo>...</foo>
    <foo>...</foo>
  </a1>
  <a2>
    <faa>...</faa>
    <faa>...</faa>
    <foo>...</foo>
  </a2>
  <a3>
    <fii>...</fii>
    <fii>...</fii>
    <fii>...</fii>
  </a3>
</r>

Возможно ли с помощью только XPath выбрать элемент aX (здесь, в примере, элемент a1), содержащий только foo дочерние элементы ?

Ответы [ 3 ]

2 голосов
/ 18 июня 2020

Этот XPath,

//*[foo][not(*[not(self::foo)])]

выбирает все элементы, которые имеют foo дочерние элементы и не имеют других дочерних элементов .

Пояснение

  • //* выбирает все элементы в документе
  • //*[foo] ... которые имеют хотя бы один foo дочерний элемент
  • //*[foo][not(*[not(self::foo)])]. ..и у not есть дочерние элементы, которые не foo. Поскольку мы уже предположили, что должен существовать дочерний элемент foo, добавив, что не может быть других, кроме дочернего элемента foo, мы гарантируем наличие foo и только foo дочерние элементы по запросу.
1 голос
/ 18 июня 2020

Используйте этот XPath, чтобы получить все элементы, у которых есть элементы «foo», как дочерние

//*[foo]
0 голосов
/ 19 июня 2020

Чтобы завершить ответ @kjhughes, два рабочих XPath:

//foo[count(preceding-sibling::*)=count(preceding-sibling::foo)]/..
//*[starts-with(name(),"a")][count(.//*)=count(.//foo)]

Вывод:

<a1>
    <foo>...</foo>
    <foo>...</foo>
    <foo>...</foo>
</a1>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...