XPath para devolver la concatenación de cadenas de valores de nodo secundario calificados

StackOverflow https://stackoverflow.com/questions/1403971

  •  05-07-2019
  •  | 
  •  

Pregunta

¿Alguien puede sugerir un formato de expresión XPath que devuelva un valor de cadena que contenga los valores concatenados de ciertos nodos secundarios calificados de un elemento, pero ignorando otros:

<div>
    This text node should be returned.
    <em>And the value of this element.</em>
    And this.
    <p>But this paragraph element should be ignored.</p>
</div>

El valor devuelto debe ser una sola cadena:

This text node should be returned. And the value of this element. And this.

¿Es esto posible en una sola expresión XPath?

Gracias.

¿Fue útil?

Solución

En XPath 1.0:

Puedes usar

/div//text()[not(parent::p)]

para capturar los nodos de texto deseados. La concatenación en sí no se puede hacer en XPath 1.0, recomiendo hacerlo en la aplicación host.

Otros consejos

En XPath 2.0 :

string-join (/ * / node () [not (self :: p)], '')

/div//text()

doble barra obliga a extraer texto independientemente de los nodos intermedios

Este aspecto que funciona:

Uso como contexto / div / :

text() | em/text()

O sin el uso de contexto:

/div/text() | /div/em/text()

Si desea concentrar las dos primeras cadenas, use esto:

concat(/div/text(), /div/em/text())

Si desea todos los hijos excepto p, puede probar lo siguiente ...

    string-join(//*[name() != 'p']/text(), "")

que devuelve ...

This text node should be returned.
And the value of this element.
And this.

También podría usar un bucle para cada uno y ensamblar los valores en una variable como esta

<xsl:variable name="newstring">
    <xsl:for-each select="/div//text()">
      <xsl:value-of select="."/>
    </xsl:for-each>
  </xsl:variable>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top