2011-02-17 25 views
116

Tener el siguiente código XML:XPath: seleccione nodo de texto

<node>Text1<subnode/>text2</node> 

¿Cómo se selecciona el primer o el segundo nodo de texto a través de XPath?

Algo como esto:

/node/text()[2] 

por supuesto no funciona porque es el resultado combinado de todos los textos dentro del nodo.

+10

Usted escribió: * '/ node/text() [2]' [...] no funciona porque es el resultado fusionado de cada texto dentro del nodo * Eso está mal: significa * segundo hijo del nodo de texto del elemento raíz 'nodo' *. El ** valor de cadena ** (concatenación de nodos descendientes de texto) sería 'string (/ node)' –

+0

¿Quiere decir que la consulta Xpath debería funcionar? Bueno, supongo que tengo otro problema en otro lado entonces. ;) ¡Gracias! – kernel

+0

Buena pregunta, +1. Consulte mi respuesta para obtener una explicación y varias expresiones XPath que seleccionan todos o un elemento secundario de nodo de texto específico del elemento superior. –

Respuesta

141

Tener el siguiente código XML:

<node>Text1<subnode/>text2</node> 

¿Cómo selecciono la primera o la segunda nodo de texto a través de XPath?

Uso:

/node/text() 

Esto selecciona todos los niños de texto nodos del elemento superior (llamado "nodo") del documento XML.

/node/text()[1] 

Selecciona el primer elemento de nodo de texto del elemento superior (denominado "nodo") del documento XML.

/node/text()[2] 

Esto selecciona el segundo hijo de nodo de texto del elemento superior (denominado "nodo") del documento XML.

/node/text()[someInteger] 

Selecciona el texto niño-nodo someInteger-ésima del elemento superior (llamado "nodo") del documento XML. Es equivalente a la siguiente expresión XPath:

/node/text()[position() = someInteger] 
+1

'/ node [2]/text()' funciona bien para mí en Chrome 39. –

+0

gracias por el comentario. Ahorro algunas horas de fuerza bruta! –

+0

@NaftuliTzviKay: Esto significa que Chrome está roto. '/ node [2]' no debe seleccionar ningún nodo si el documento XML de origen está bien formado. Por definición, en un documento XML bien formado solo hay un elemento superior (único), también conocido como 'document-element' –

22

su xpath debería funcionar. He probado tu xpath y el mío en la implementación de MarkLogic y Zorba Xquery/Xpath.

Ambos deberían funcionar.

/node/child::text()[1] - should return Text1 
/node/child::text()[2] - should return text2 


/node/text()[1] - should return Text1 
/node/text()[2] - should return text2 
Cuestiones relacionadas