Я считаю, что это возможно, но не смог понять синтаксис. Что-то вроде этого:Как выбрать все листовые узлы с использованием выражения XPath?
xmlNode.SelectNodes("//*[count(child::*) <= 1]")
но это неправильное.
Я считаю, что это возможно, но не смог понять синтаксис. Что-то вроде этого:Как выбрать все листовые узлы с использованием выражения XPath?
xmlNode.SelectNodes("//*[count(child::*) <= 1]")
но это неправильное.
Использование:
//node()[not(node())]
В случае только элемент листовые узлы хотел (а это требует разъяснения - это элементы, которые имеют не-элементных дети считаются листовые узлы?), То следующий XPath выражение выбирает их:
//*[not(*)]
Оба выражения выше, вероятно, самый короткий, что выбрать нужный узлы (либо узловые узлы, либо элементы - листовые узлы).
Можете ли вы объяснить, почему это работает? Я просмотрел синтаксис XPath и некоторые уроки, но я не могу понять, почему это работает. – rrs
@rrs: первое выражение выбирает любой узел в документе XML, который не имеет дочерних элементов - это то, что является листовым узлом - по определению. Второй делает что-то подобное, но выбирает любой элемент, у которого нет дочернего элемента. –
Я понимаю, что он делает, но не так, как он это делает. Почему/как 'not (*)' выбирает листовые узлы/элементы? – rrs
Почему меньше или равно до 1?
xmlNode.SelectNodes("//*[count(child::*) = 0]")
сделать тесты и т.д. на этом сайте http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm
Довольно полезный ..
и @miliu: проверка счета не требуется. Проверьте ответ @kevpie. – 2010-10-13 19:33:01
@Alejandro, действительно .. –
Любые элементы, не имеющие элементов ребенка
//*[not(child::*)]
Большое спасибо. Он отлично работает. – newman
+1 Правильный ответ.Но это означает: * любые элементы без элемента child *. Таким образом, он будет выбирать элементы с дочерним элементом текстового узла, пустые элементы, элементы со смешанным контентом (текстовые узлы, PI, комментарии) – 2010-10-13 19:30:57
+1 @Alejandro, разъяснение оценивается! – kevpie
Я добавляю этот ответ XSLT поскольку оно кажется, что передние матчи google не имеют такого решения:
После долгой борьбы с извлекая CDATA в XML, в конечном счете, это выражение работало лучше для меня:
<xsl:template match="*[not(child::*)]/text()">
Хороший вопрос, +1. См. Мой ответ для, вероятно, кратчайшего выражения XPath, которое выбирает точно все листовые узлы. :) –