Dirigirse a parte de un comentario usando XPath

Estoy tratando de usar xpath para devolver el valor "Vancouver", ya sea del comentario o del texto que sigue. ¿Alguien puede señalarme en la dirección correcta?

La ubicación li siempre es el primer elemento, pero no siempre está presente, y el número de elementos de la lista después varía para cada elemento.

<item>
<title>
<description>
<!-- Comment #1 -->
<ul class="class1">
<li> <!-- ABC Location=Vancouver -->Location: Vancouver</li>
<li> <!-- More comments -->Text</li>
<li> text</li>
</ul>
</description>
</item>

preguntado el 03 de mayo de 12 a las 20:05

3 Respuestas

Esto lo sacará del texto después del comentario:

substring-after(//ul[@class='class1']/li[position()=1 and contains(.,'Location:')],'Location: ')

Esto especifica la primera <li> dentro de <ul> de la clase 'clase1', solo cuando contiene 'Ubicación:', y toma la cadena después de 'Ubicación:'. Si desea relajar el requisito de que sea el primer li, use esto:

substring-after(//ul[@class='class1']/li[contains(.,'Location:')],'Location: ')

contestado el 03 de mayo de 12 a las 20:05

Esto no es elocuente y podría causar problemas si su "Ubicación: #####" cambiara estructuralmente, porque esta es una solución estática, pero funciona para lo anterior:

substring(//item//li[1],12,string-length(//item//li[1])-10)

Y esto devuelve el equivalente de cadena, no un nodo. Lo apresuré un poco, así que daré una mejor solución con el tiempo, pero esto es algo en lo que pensar... (simplemente quita "Ubicación:" y devuelve lo que haya después...)

contestado el 03 de mayo de 12 a las 20:05

Utiliza:

  substring-after(/*/description/ul
                       /li[1]/text()[starts-with(., 'Location: ')],
                  'Location: '
                  )

Para extraer la ubicación del uso del comentario:

  substring-after(/*/description/ul
                       /li[1]/comment()[starts-with(., ' ABC Location=')],
                  ' ABC Location='
                  )

Verificación basada en XSLT:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "substring-after(/*/description/ul
                           /li[1]/text()[starts-with(., 'Location: ')],
                      'Location: '
                      )
     "/>
==========

     <xsl:copy-of select=
     "substring-after(/*/description/ul
                           /li[1]/comment()[starts-with(., ' ABC Location=')],
                      ' ABC Location='
                      )
     "/>

 </xsl:template>
</xsl:stylesheet>

cuando esta transformación se aplica en el documento XML proporcionado:

<item>
    <title/>
    <description>
        <!-- Comment #1 -->
        <ul class="class1">
            <li>
                <!-- ABC Location=Vancouver -->Location: Vancouver
            </li>
            <li>
                <!-- More comments -->Text
            </li>
            <li> text</li>
        </ul>
    </description>
</item>

las dos expresiones XPath se evalúan y los resultados de las evaluaciones se copian en la salida:

Vancouver

==========

Vancouver 

contestado el 04 de mayo de 12 a las 14:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.