2012-02-29 31 views
17

¿Alguien puede explicar la diferencia entre las funciones de texto() y cadena(). A menudo uso uno con otro, pero no hace ninguna diferencia, ambos obtendrán el valor de cadena del nodo xml.Diferencia entre texto() y cadena()

Respuesta

34

¿Alguien puede explicar la diferencia entre las funciones de texto() y cadena() .

I. text() no es una función, sino una node test.

Se utiliza para seleccionar todos los elementos de nodo de texto del nodo de contexto.

Por lo tanto, si el nodo de contexto es un elemento denominado x, entonces text() selecciona todos los hijos de texto-nodo de x.

Otros ejemplos:

/a/b/c/text() 

selecciona todos los niños de texto de nodo de cualquier elemento de c que es un niño de cualquier elemento de b que es un hijo del elemento superior a.

II. La función string()

Por definición string(exprSelectingASingleNode) devuelve string value del nodo.

El valor de cadena de un elemento es la concatenación de todos sus descendientes de nodo de texto, en orden de documento.

Por lo tanto, si en el siguiente documento XML:

<a> 
    <b>2</b> 
    <c>3 
    <d>4</d> 
    </c> 
    5 
</a> 

string(/a) retornos (sin las comillas rodean):

" 
    2 
    3 
    4 

    5 
" 

Como vemos, el valor de cadena refleja tres espacios en blanco -nicamente los nodos de texto, que normalmente no notamos ni contabilizamos.

Algunos analizadores XML tienen la opción de quitar nodos de texto de espacio en blanco solamente. Si el documento anterior se ha analizado con los nodos de texto de espacio en blanco sólo se quitó, entonces la misma función:

string(/a) 

vuelve ahora:

"23 
    4 
    5 
" 
6

mayoría de las veces, si desea que el contenido de un nodo de elemento X, puede referirse a él como ".", si es el nodo de contexto, o como "X" si es un elemento secundario del nodo de contexto.Por ejemplo:

<xsl:if test="X = 'abcd'">... 

o

<xsl:value-of select="."/> 

En ambos casos, debido a que el contexto exige una cadena, la función string() se aplica automáticamente. (Es una pequeña simplificación, si está ejecutando XSLT 2.0 con esquemas, las reglas son un poco más complicadas).

Usando "string()" aquí no es necesario, porque se hace automáticamente; y usar text() es un error (uno que parece ser cada vez más común, alentado por algunos malos tutoriales en la web). Si utiliza ./text() o X/text() en esta situación, obtendrá todos los elementos de nodo de texto del elemento. A menudo, el elemento tiene un hijo de nodo de texto cuyo valor de cadena es el mismo que el valor de cadena del elemento, pero el código falla si alguien agrega un comentario o instrucción de procesamiento, porque el valor se divide en varios nodos de texto. También falla si el elemento es una (decir "title") que permite contenido mixto: string(title) y title/text() van a dar la misma respuesta hasta llegar a un artículo con el título

<title>On the wetness of H<sub>2</sub>O</title> 
+0

Yo solía creer que el uso de una La expresión como select = "/ somenode/text()" sería de hecho más precisa y menos propensa a errores. ¿Estás sugiriendo que la parte/text() es innecesaria, incluso un error? ¿Podrían discutir brevemente cuándo es una buena idea o útil usar/text()? Gracias – user8658912

+0

Los comentarios no están diseñados para hacer preguntas adicionales, por favor plantee una nueva pregunta. –

+0

(en otras palabras) Su afirmación de que _ "cadena() se aplica automáticamente" _ es verdadera en varios elementos XSLT, como xsl: value-of. Sin embargo, tenga en cuenta que el usuario no menciona XSLT en absoluto en su pregunta. Entonces, como explicaste, usar texto() o cadena() suele ser incorrecto/innecesario ** en XSLT **, pero tiene sentido usar cadena() por ejemplo en XQuery cuando se espera el valor de cadena de un nodo, de lo contrario obtendríamos el nodo completo en su lugar, ¿verdad? Mientras que el texto() sería más apropiado para navegar específicamente a través de los nodos de texto. – user8658912

Cuestiones relacionadas