2012-06-13 46 views
6

Estoy tratando de obtener todo el texto en un nodo para un conjunto siguiente y regresar como un solo valor (no múltiples nodos).XPath para obtener todo el texto en elemento como un valor, eliminando saltos de línea

<p> 
    "I love eating out." 
    <br> 
    <br> 
    "This is my favorite restaurant." 
    <br> 
    "I will definitely be back" 
</p> 

Estoy usando '/ p' y obtengo todos los resultados, pero regresa con saltos de línea. También al intentar '/ p/text()' se obtiene cada texto entre cada etiqueta como un valor devuelto por separado. El retorno ideal sería -

"I love eating out. This is my favorite restaurant. I will definitely be back" 

He intentado buscar otras preguntas pero no he podido encontrar algo tan cerca. Por favor, no en el entorno actual, estoy restringido a usar solo una consulta XPath y no puedo analizar después o configurar ningún pre-análisis HTML. Específicamente, estoy usando la función importXML dentro de Google Docs.

+0

Simplemente seleccione el texto de todos los descendientes de ' p' con '/ p // */text()'. Acceda al contenido del nodo de texto con 'textContent'. Aún necesitarás concatenarlos juntos. – nhahtdh

Respuesta

7

Uso:

normalize-space(/) 

Cuando se evalúa esta expresión XPath, el valor de cadena del nodo documento (/) se produce primero y esto se proporciona como argumento de la función XPath estándar normalize-space().

Por definición, normalize-space() devuelve su argumento con los caracteres de espacios en blanco adyacentes iniciales y finales eliminados, y cualquier grupo provisional de espacios en blanco adyacentes - reemplazado por un carácter de espacio único.

La evaluación de la expresión XPath anteriores resultados en:

"Me encanta comer fuera." "Este es mi restaurante favorito." "Yo sin duda volveremos"

para eliminar las cotizaciones, que, además, utilizamos la función translate():

normalize-space(translate(/,'&quot;', '')) 

El resultado de evaluar esta expresión es:

I love eating out. This is my favorite restaurant. I will definitely be back 

Finalmente, para que este resultado esté entre comillas, usamos la función concat() :

concat('&quot;', 
     normalize-space(translate(/,'&quot;', '')), 
     '&quot;' 
     ) 

La evaluación de esta expresión XPath produce exactamente el resultado deseado:

"I love eating out. This is my favorite restaurant. I will definitely be back" 

XSLT - verificación basada:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "concat('&quot;', 
      normalize-space(translate(/,'&quot;', '')), 
      '&quot;' 
      )"/> 
</xsl:template> 
</xsl:stylesheet> 

Cuando se aplica en esta transformación el documento XML proporcionado (correcto) ed a hacerse bien formado):

expresión
<p> 
     "I love eating out." 
     <br /> 
     <br /> 
     "This is my favorite restaurant." 
     <br /> 
     "I will definitely be back" 
</p> 

la XPath se evalúa y el resultado de esta evaluación se copia a la salida:

"I love eating out. This is my favorite restaurant. I will definitely be back" 
+1

Respuesta increíble. Esto funciona bien, pero me pregunto si normalize-space funciona cuando se miran varios hijos ... Cuando utilicé normalize-space contra conjuntos de datos similares en una página, en lugar de devolver múltiples valores individuales, solo se devolvió un único valor para el conjunto página (incluso si había varios niños con datos similares que estaba tratando de extraer). Mi objetivo es evaluar múltiples áreas similares en la página y devolver cada una como un valor único. –

+0

@RichardOrtega: Esto no es posible como una expresión * single * XPath 1.0 (con XPath 2.0 es posible escribir una sola expresión para producir una secuencia que contenga exactamente las cadenas deseadas). Entonces, con XPath 1.0, necesitará seleccionar los nodos de texto uno por uno y procesar cada nodo seleccionado en el lenguaje de programación que hospeda XPath. Si está interesado en una solución XSLT, simplemente haga una nueva pregunta y hágamelo saber :) –

+0

muchas gracias, ¡ha sido de gran ayuda! Muy informativo, fue una de mis primeras veces usando XPath. –

Cuestiones relacionadas