Estoy insertando algunos datos XML en una columna XML en el servidor SQL, pero después de que los datos se hayan insertado, el servidor sql los ha cambiado. Aquí están los datos que inserto
<xsl:value-of select="name/n/given" />
<xsl:text> </xsl:text>
<xsl:value-of select="name/n/family" />
Cuando lo leo de nuevo, se ve así
<xsl:value-of select="name/n/given" />
<xsl:text />
<xsl:value-of select="name/n/family" />
Presta atención a la segunda línea. Esto es un problema porque cambia la forma en que será la salida de la transformación XSLT. El primer ejemplo creará un espacio entre el apellido y el apellido, mientras que el segundo no creará ningún espacio, por lo que será como JohnJohnsen, mientras que el primero será como John Johnsen.
¿Hay alguna forma de resolver esto?
sql-server
xml
Sr. Zach
fuente
fuente
_
o~
) y luego reemplazarlo con un espacio en el momento de la presentación.Respuestas:
Puede usar
xml:space = "preserve"
en los nodos donde desea mantener el espacio. Usar xml: space es "solo una señal de intención", pero el servidor SQL es amable con nosotros aquí.Para un nodo
Resultado:
Documento completo:
Resultado:
Otra opción para todo el documento es usar convertir con estilo 1 .
fuente
Esta página de la documentación de SQL Server dice
Para su ejemplo, supongo que considera que el espacio en blanco de la etiqueta central no es significativo y, por lo tanto, es libre de refactorizar la representación. No creo que haya una solución para esto; así es como SQL Server implementa el tipo de datos XML.
Las soluciones alternativas incluirían el uso de un marcador de posición en lugar de espacios en blanco como dice @Aaron. El consumidor debe recordar insertar y quitar estas fichas. Alternativamente, defina la columna como nvarchar en lugar de XML. Esto definitivamente preservará todo el espacio en blanco y cualquier otro formato. Un ejemplo rápido:
La columna nvarchar conserva el formato de entrada, la columna XML no.
Perderá la capacidad de usar XPATH en consultas SQL. Si el XML solo se destruye en la aplicación, esto es irrelevante. Además, la cadena de caracteres podría comprimirse ahorrando espacio en la base de datos, si esto es importante para usted.
fuente
Podrías envolver tu espacio
CDATA
al almacenar los datos:Parece que el servidor SQL mantiene el espacio internamente, pero elimina el
CDATA
marcado innecesario en sí mismo al recuperar el resultado usandoSELECT
. Afortunadamente, el espacio se mantiene cuando se reutiliza el resultado de talSELECT
:El resultado será:
fuente