2011-06-21 17 views
6

tengo código html así:XPath: seleccionar texto después de cierta etiqueta y antes mismo lado etiqueta

<strong>Term:</strong> 
Some text<br /> 
More text<br /> 
Some more lines of text 
<strong>Term:</strong> 
Some text<br /> 
More text<br /> 
Some more lines of text 
<strong>Second term:</strong> 
Some text<br /> 
More text<br /> 
Some more lines of text 
<strong>Term:</strong> 
Some text<br /> 
More text<br /> 
Some more lines of text 

que necesito para obtener los nodos de texto entre la etiqueta con el texto "Plazo" y antes de la siguiente etiqueta:

Some text 
More text 
Some more lines of text 
Some text 
More text 
Some more lines of text 
Some text 
More text 
Some more lines of text 

Aquí se puede usar la condición: la etiqueta anterior debe contener el texto "Término", pero no sé cómo crear el selector xpath de esta manera.

+1

Hola, siento que la pregunta no es muy clara. ¿Puede por favor publicar cuál es el resultado deseado? Puede ser entonces puedo entender qué es exactamente lo que quieres. – Ravish

+0

Hice la actualización de la pregunta. Perdón por mi mal ingles. –

+0

Ha cambiado su entrada, actualice también la salida deseada. Además, agregue texto significativo para diferenciar entre chilren ndoes. Según su descripción, todavía es difícil entender lo que necesita. –

Respuesta

2

Su pregunta aún es ambigua y su documento de entrada no está bien formado. Mira esto:

root/text()[preceding::strong[1][contains(text(),'Term')]] 

Aplicado en:

<root> 
<strong>Term:</strong> 
Some text<br /> 
More text<br /> 
Some more lines of text 
<strong>Term:</strong> 
Some text2<br /> 
More text2<br /> 
Some more lines of text2 
<strong>Second term:</strong> 
Some text3<br /> 
More text3<br /> 
Some more lines of text3 
<strong>Term:</strong> 
Some text4<br /> 
More text4<br /> 
Some more lines of text4 
</root> 

produce:

Some text 
More text 
Some more lines of text 

Some text2 
More text2 
Some more lines of text2 

Some text4 
More text4 
Some more lines of text4 

Este XPath, selecciona todos los nodos de texto entre un elemento que contienen la cadena Term: y un elemento que contiene cualquier cadena:

//text()[preceding::*[contains(text(),'Term:')] and following::*[text()]] 

Aplicada en:

<root> 
<strong>Term:</strong> 
Some text<br /> 
More text<br /> 
Some more lines of text 
<strong>Second term:</strong> 
Some text2<br /> 
More text2<br /> 
Some more lines of text2 
</root> 

Devuelve:

Some text 
More text 
Some more lines of text 
4
//text()[preceding::*[contains(text(),'Term:')] and following::*[contains(text(),'Term:')]] 

Es lo mismo que lo ha sugerido empo. Sin embargo, estoy buscando un nodo que contenga Término y devuelva todos los nodos de texto presentes entre ellos.

Sin embargo, esto funciona bien solo si no tiene ningún otro conjunto de "Término". Avíseme si ese es el caso, porque entonces este Xpath también devolverá algunos valores no deseados.

Desde ahora que ha actualizado la entrada. Simplemente he puesto una condición más al Xpath anterior.

//text()[preceding::*[contains(text(),'Term:')] and following::*[contains(text(),'Term:')] and not(contains(., 'Term:'))] 

@empo solution también funciona. Pero ahí estamos tomando <strong> en cuenta. El xpath que he escrito simplemente comprueba la palabra 'Término:' y da todos los textNodes entre ellos.

Avísame si esto funciona para ti.

Atentamente.

+0

Su solución funciona excelente, pero solo devuelve una coincidencia. ¿Qué sucede si necesito obtener todo el texto después de todas las etiquetas con el texto "Término"? –

+0

@Stephan deberías mostrarnos mucho más de tu documento de entrada. –

+0

Ejemplo actualizado. –

Cuestiones relacionadas