Creo que es posible, pero no pude entender la sintaxis. Algo como esto:¿Cómo seleccionar todos los nodos de hoja usando la expresión XPath?
xmlNode.SelectNodes("//*[count(child::*) <= 1]")
pero esto no es correcto.
Creo que es posible, pero no pude entender la sintaxis. Algo como esto:¿Cómo seleccionar todos los nodos de hoja usando la expresión XPath?
xmlNode.SelectNodes("//*[count(child::*) <= 1]")
pero esto no es correcto.
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).
¿Puedes explicar por qué funciona esto? Revisé la sintaxis de XPath y algunos tutoriales, pero no puedo entender por qué funciona. – rrs
@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. –
Entiendo lo que hace, pero no cómo lo hace. ¿Por qué/cómo 'not (*)' selecciona nodos/elementos de hoja? – rrs
¿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 ..
y @miliu: la prueba de recuento no es necesaria. Verifique la respuesta de @kevpie. –
@Alejandro, de hecho .. –
Cualquier elemento con ningún niño elemento
//*[not(child::*)]
Muchas gracias. Funciona muy bien también. – newman
+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) –
+1 @Alejandro, se agradece la aclaración. – kevpie
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()">
Buena pregunta, 1. Vea mi respuesta para la expresión XPath probablemente más corta que selecciona exactamente todos los nodos de hoja. :) –