XPath: seleccionar nodo de texto

150

Tener el siguiente XML:

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

¿Cómo selecciono 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 cada texto dentro del nodo.

núcleo
fuente
11
Usted escribió: /node/text()[2][...] no funciona porque es el resultado combinado de cada texto dentro del nodo. Eso está mal: significa el segundo nodo de texto hijo del nodeelemento raíz . El valor de cadena (concatenación de nodos de texto descendientes) seríastring(/node)
¿Quiere decir que la consulta Xpath debería funcionar? Bueno, supongo que tengo otro problema en otro lugar entonces. ;) ¡Gracias!
kernel
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.
Dimitre Novatchev

Respuestas:

183

Tener el siguiente XML:

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

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

Uso :

/node/text()

Esto selecciona todos los elementos secundarios de nodo de texto del elemento superior (denominado "nodo") del documento XML.

/node/text()[1]

Esto selecciona el primer hijo 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]

Esto selecciona el elemento secundario del nodo de texto someInteger-th del elemento superior (denominado "nodo") del documento XML. Es equivalente a la siguiente expresión XPath:

/node/text()[position() = someInteger]
Dimitre Novatchev
fuente
@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 comodocument-element
Dimitre Novatchev
1
¿Funciona esto en PHP? Estoy tratando de recorrer solo los nodos de texto, incluso aquellos entre un conjunto de etiquetas. El problema es que está rompiendo el contenido de múltiples nodos de texto, independientemente de las etiquetas. Utilizando de //*[text()]todos modos. /html/text()No funciona.
Aaron Gillion
2
@AaronGillion, Sí, AFAIK PHP tiene una evaluación XPath 1.0 que funciona correctamente. Tenga en cuenta que /html/text()no selecciona todos los nodos de texto en el documento, solo los nodos de texto que son hijos (no descendientes) del htmlelemento superior . Probablemente quieras /html//text() . Por lo general, se requiere cierto conocimiento y comprensión de XPath para construir expresiones XPath.
Dimitre Novatchev
Gracias. ¡Descubrí el truco de la doble barra hace un poco!
Aaron Gillion
@AaronGillion, De nada. Puede aprender los conceptos básicos de XPath 1.0 y 2.0 en el módulo 2 de este curso de capacitación en línea: pluralsight.com/courses/xslt-foundations-part1
Dimitre Novatchev
29

tu xpath debería funcionar. He probado su 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
kadalamittai
fuente