Ich füge einige XML-Daten in eine XML-Spalte in SQL Server ein, aber nachdem die Daten eingefügt wurden, wurden sie von SQL Server geändert. Hier sind die Daten, die ich einfüge
<xsl:value-of select="name/n/given" />
<xsl:text> </xsl:text>
<xsl:value-of select="name/n/family" />
Wenn ich es zurücklese, sieht es so aus
<xsl:value-of select="name/n/given" />
<xsl:text />
<xsl:value-of select="name/n/family" />
Achten Sie auf die zweite Zeile. Dies ist ein Problem, da sich dadurch die Ausgabe der XSLT-Transformation ändert. Das erste Beispiel erzeugt ein Leerzeichen zwischen Vorname und Familienname, während das zweite kein Leerzeichen erzeugt, also wie JohnJohnsen, während das erste wie John Johnsen ist.
Gibt es eine Möglichkeit, dies zu lösen?
sql-server
xml
Herr Zach
quelle
quelle
_
oder~
) und dieses dann zur Präsentationszeit durch ein Leerzeichen ersetzen.Antworten:
Sie können
xml:space = "preserve"
auf den Knoten verwenden, auf denen Sie den Speicherplatz behalten möchten. Die Verwendung von xml: space ist "nur ein Signal der Absicht", aber SQL Server ist hier nett zu uns.Für einen Knoten
Ergebnis:
Gesamtes Dokument:
Ergebnis:
Eine weitere Option für das gesamte Dokument ist die Verwendung der Konvertierung mit Stil 1 .
quelle
Auf dieser Seite der SQL Server-Dokumentation heißt es
Ich nehme an, für Ihr Beispiel ist der Leerraum des mittleren Tags nicht signifikant und es steht daher frei, die Darstellung umzugestalten. Ich glaube nicht, dass es dafür eine Lösung gibt. Es ist nur, wie SQL Server den XML-Datentyp implementiert.
Workarounds würden die Verwendung eines Platzhalters anstelle von Leerzeichen beinhalten, wie @Aaron sagt. Der Verbraucher muss daran denken, diese Token einzulegen und abzustreifen. Alternativ können Sie die Spalte als nvarchar anstelle von XML definieren. Dadurch bleiben auf jeden Fall alle Leerzeichen und andere Formatierungen erhalten. Ein kurzes Beispiel:
Die nvarchar-Spalte behält das Eingabeformat bei, die XML-Spalte nicht.
Sie verlieren die Möglichkeit, XPATH in SQL-Abfragen zu verwenden. Wenn das XML nur in der Anwendung geschreddert wird, spielt dies keine Rolle. Außerdem kann die Zeichenfolge komprimiert werden, um Platz in der Datenbank zu sparen, wenn dies für Sie von Bedeutung ist.
quelle
Sie könnten Ihren Platz
CDATA
beim Speichern der Daten einschließen:Es scheint, dass SQL Server den Speicherplatz dann intern behält, aber das unnötige
CDATA
Markup selbst entfernt, wenn das Ergebnis wieder verwendet wirdSELECT
. Glücklicherweise bleibt der Platz erhalten, wenn das Ergebnis von Folgendem wiederverwendet wirdSELECT
:Das Ergebnis wird sein:
quelle