¿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
¿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
"
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>
- 1. ¿Diferencia entre la cadena y el texto en los rieles?
- 2. Diferencia entre val() y texto()
- 3. Diferencia entre Convert.ToDecimal (cadena) y Decimal.Parse (cadena)
- 4. Diferencia entre y
- 5. ¿Cuál es la diferencia entre Convert.ToBoolean (cadena) y Boolean.Parse (cadena)?
- 6. Diferencia entre getString() y getResources.getString()
- 7. Diferencia entre el tipo de datos "Texto" y "Cadena" en SQLite
- 8. Diferencia entre BufferedReader y BufferedInputStream
- 9. Diferencia entre archivos escritos en modo binario y texto
- 10. Diferencia entre cadena binaria, cadena de bytes, cadena Unicode y una cadena ordinaria (str)
- 11. Diferencia entre decimal y decimal
- 12. Diferencia entre @string y @ + string?
- 13. ¿Cuál es la diferencia entre (cadena [] args) y System.Environment.CommandLine?
- 14. diferencia de longitud de cadena entre 1,8 y 1,9 rubí
- 15. Diferencia entre los tipos de cadena y char [] en C++
- 16. Diferencia entre eval y setTimeout ejecutar código de cadena
- 17. Diferencia entre String.getBytes() y Bytes.toBytes (datos de cadena)
- 18. Diferencia entre Setting.settings y web.config?
- 19. Diferencia entre String.isEmpty() y String.equals ("")
- 20. MySQL: diferencia entre ', `,' y"
- 21. Diferencia entre. y #
- 22. Diferencia entre & y &
- 23. ¿Diferencia entre == y caso?
- 24. Diferencia entre objeto y *?
- 25. La diferencia entre $ * y $ @
- 26. VBA: Diferencia entre y y +
- 27. diferencia porcentual entre dos archivos de texto
- 28. Diferencia entre fgets y fscanf?
- 29. Diferencia entre RSCRIPT y Littler
- 30. Diferencia entre char a [] = "cadena"; char * p = "cadena";
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
Los comentarios no están diseñados para hacer preguntas adicionales, por favor plantee una nueva pregunta. –
(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