2010-10-13 16 views

Respuesta

56

Uso:

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

En caso sólo elemento nodos hoja son deseados (y esto necesita una aclaración - son elementos que tienen niños que no son considerados elementos de nodos hoja?), Entonces la siguiente XPath la expresión de los selecciona:

//*[not(*)] 

Ambas expresiones anteriores son, probablemente, el más corto que seleccionar el deseado nodos (nodos any-node o element-leaf).

+0

¿Puedes explicar por qué funciona esto? Revisé la sintaxis de XPath y algunos tutoriales, pero no puedo entender por qué funciona. – rrs

+0

@rrs: la primera expresión selecciona cualquier nodo del documento XML que no tenga ningún elemento secundario, esto es lo que es un nodo hoja, por definición. El segundo hace algo similar, pero selecciona cualquier elemento que no tenga un elemento hijo. –

+0

Entiendo lo que hace, pero no cómo lo hace. ¿Por qué/cómo 'not (*)' selecciona nodos/elementos de hoja? – rrs

1

¿Por qué menos o igual a 1?

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

Hacer pruebas, etc. en este sitio http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm

Bastante útil ..

+0

Muchas gracias. Esto funciona genial Por lo tanto, es más estilo VB igual. Pensé que debería ser de estilo c porque las funciones distinguen entre mayúsculas y minúsculas. ¿Por qué <= 1? Me confundieron los ChildNodes.Count que devuelven 1 para x, pero devuelve 0 para . – newman

+0

y @miliu: la prueba de recuento no es necesaria. Verifique la respuesta de @kevpie. –

+0

@Alejandro, de hecho .. –

24

Cualquier elemento con ningún niño elemento

//*[not(child::*)] 
+0

Muchas gracias. Funciona muy bien también. – newman

+2

+1 Respuesta correcta.Pero significa: * cualquier elemento sin elemento hijo *. Por lo tanto, seleccionará elementos con texto nodo hijo, elementos vacíos, elementos con contenido mixto (nodos de texto, PI, comentarios) –

+0

+1 @Alejandro, se agradece la aclaración. – kevpie

0

estoy añadiendo esta respuesta ya que XSLT parece que los enfrentamientos frontales de Google carecen de esa solución:

Después de una larga lucha contra la extracción CDATA como XML, con el tiempo, esta expresión funcionaron mejor para mí:

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