Uważam, że jest to możliwe, ale nie udało mi się ustalić składni. Coś takiego:Jak wybrać wszystkie węzły liści za pomocą wyrażenia XPath?
xmlNode.SelectNodes("//*[count(child::*) <= 1]")
, ale to nie jest poprawne.
Uważam, że jest to możliwe, ale nie udało mi się ustalić składni. Coś takiego:Jak wybrać wszystkie węzły liści za pomocą wyrażenia XPath?
xmlNode.SelectNodes("//*[count(child::*) <= 1]")
, ale to nie jest poprawne.
Zastosowanie:
//node()[not(node())]
W przypadku tylko elementem liść węzły są chciał (a to wymaga wyjaśnienia - to elementy, które mają dzieci non-element uważane węzły Leaf?), Wtedy po XPath wyrażenie wybiera je:
//*[not(*)]
Oba wyrażenia powyżej są prawdopodobnie najkrótsza który wybrać żądany węzły (węzły dowolnego węzła lub elementu - liścia).
Czy możesz wyjaśnić, dlaczego to działa? Przejrzałem składnię XPath i kilka samouczków, ale nie mogę do końca zrozumieć, dlaczego to działa. – rrs
@rrs: Pierwsze wyrażenie wybiera dowolny węzeł w dokumencie XML, który nie ma żadnych potomków - z definicji jest to węzeł liścia. Drugi robi coś podobnego, ale wybiera dowolny element, który nie ma elementu child - element. –
Rozumiem, co robi, ale nie jak to robi. Dlaczego/w jaki sposób 'not (*)' wybieram węzły/elementy liści? – rrs
Dlaczego mniej lub równa do 1?
xmlNode.SelectNodes("//*[count(child::*) = 0]")
Dodać badań ETC w tym miejscu http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm
bardzo pomocny ..
i @miliu: test zliczania nie jest potrzebny. Sprawdź odpowiedź @kevpie. –
@Alejandro, rzeczywiście .. –
żadnych elementów bez elementu podrzędnego
//*[not(child::*)]
Dziękuję bardzo. Działa również świetnie. – newman
+1 Prawidłowa odpowiedź.Ale oznacza to: * dowolne elementy bez elementu child *. Dlatego wybierze elementy z węzłem tekstowym, pustymi elementami, elementami o mieszanej zawartości (węzły tekstowe, PI, komentarze). –
+1 @Alejandro, zrozumienie jest mile widziane! – kevpie
Dodaję ten XSLT odpowiedź od niego Wygląda na to, że w początkowych meczach google brakuje takiego rozwiązania:
Po długiej walce z wydobycia CDATA jako XML, ostatecznie, to wyrażenie pracował dla mnie najlepsze:
<xsl:template match="*[not(child::*)]/text()">
dobre pytanie +1. Zobacz moją odpowiedź na prawdopodobnie najkrótsze wyrażenie XPath, które wybiera dokładnie wszystkie węzły liści. :) –