Как выбрать все конечные узлы, используя выражение XPath? - PullRequest
41 голосов
/ 13 октября 2010

Я верю, что это возможно, но не смог понять синтаксис.Примерно так:

xmlNode.SelectNodes("//*[count(child::*) <= 1]")

но это не правильно.

Ответы [ 4 ]

56 голосов
/ 13 октября 2010

Используйте

//node()[not(node())]

Если требуется только элемент конечные узлы (и это требует пояснения - считаются ли элементы, у которых неэлементные дочерние элементы, конечными узлами?), То следующее выражение XPath выбирает их:

//*[not(*)]

Оба приведенных выше выражения, вероятно, являются самыми короткими , которые выбирают нужные узлы (любой узел или элемент - листовые узлы).

25 голосов
/ 13 октября 2010

Любые элементы без дочерних элементов

//*[not(child::*)]
2 голосов
/ 13 октября 2010

Почему меньше или равно 1?

xmlNode.SelectNodes("//*[count(child::*) = 0]")

Делайте тесты и т.д. на этом сайте http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm

Довольно полезно ..

0 голосов
/ 05 декабря 2017

Я добавляю этот ответ XSLT, поскольку кажется, что в первых совпадениях Google нет такого решения:

После долгой борьбы с извлечением CDATA в XML, в конце концов, это выражение сработало для меня лучше всего:

<xsl:template match="*[not(child::*)]/text()">
...