Как выбрать все листовые узлы с помощью выражения XPath?
Я считаю, что это возможно, но не смог понять синтаксис. Что-то вроде этого:
xmlNode.SelectNodes("//*[count(child::*) <= 1]")
но это неверно.
Ответы
Ответ 1
Использование
//node()[not(node())]
В случае, если требуются только узлы листового элемента (и для этого требуется уточнение - это элементы, которые имеют неэлементные дочерние элементы, рассматриваемые как листовые узлы?), тогда выбирается следующее выражение XPath:
//*[not(*)]
Оба вышеприведенных выражения, вероятно, являются самыми короткими, которые выбирают нужные узлы (любые - node или элементы - листовые узлы).
Ответ 2
Любые элементы без дочернего элемента
//*[not(child::*)]
Ответ 3
Почему меньше или равно до 1?
xmlNode.SelectNodes("//*[count(child::*) = 0]")
Сделайте тесты и т.д. на этом сайте http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm
Довольно полезно..
Ответ 4
Я добавляю этот ответ XSLT, так как кажется, что передние матчи google не имеют такого решения:
После долгой борьбы с извлечением CDATA в качестве XML, в конечном итоге это выражение работало лучше всего для меня:
<xsl:template match="*[not(child::*)]/text()">