





Вот XPath для различных интерпретаций отсутствия детей...
Нет дочерних элементов:
//p[not(*)]
Нет текстовых детей:
//p[not(text())]
Нет детей любого типа:
//p[not(node())]
Замените p выше на любое другое имя элемента или * на целевые элементы независимо от имени.
@SiebeJongebloed: Да, в то время как //p[not(*) выбирает отсутствие дочерних элементов (одна интерпретация запрошенного «нет дочерних элементов»), ваш XPath выбирает наличие дочерних текстовых узлов (не только пробелов). Таким образом, //p[not(*)] будет исключать p элементы с смешанным содержимым, тогда как ваш XPath также будет включать p элементы со смешанным содержимым.
Чтобы добавить дополнительную альтернативу, вы также можете использовать //p[text()[normalize-space()]], чтобы получить желаемый результат