Я вставляю некоторые данные XML в столбец XML на сервере SQL, но после того, как данные были вставлены, они были изменены сервером SQL. Вот данные, которые я вставляю
<xsl:value-of select="name/n/given" />
<xsl:text> </xsl:text>
<xsl:value-of select="name/n/family" />
Когда я читаю это обратно, это выглядит так
<xsl:value-of select="name/n/given" />
<xsl:text />
<xsl:value-of select="name/n/family" />
Обратите внимание на вторую строку. Это проблема, потому что она меняет то, каким будет вывод XSLT-преобразования. Первый пример создаст пробел между именем и фамилией, а второй не создаст пробела, поэтому он будет похож на JohnJohnsen, а первый будет похож на John Johnsen.
Есть ли способ решить эту проблему?
sql-server
xml
Мистер Зак
источник
источник
_
или~
), а затем заменить его пробелом во время представления.Ответы:
Вы можете использовать
xml:space = "preserve"
на узлах, где вы хотите сохранить пространство. Использование xml: space - «всего лишь сигнал о намерениях», но SQL-сервер очень добр к нам.Для одного узла
Результат:
Весь документ:
Результат:
Еще один вариант для всего документа - использовать конвертировать со стилем 1 .
источник
На этой странице документации по SQL Server написано
Для вашего примера я предполагаю, что он считает пробел среднего тега несущественным и, следовательно, свободен для рефакторинга представления. Я не думаю, что есть решение для этого; это просто, как SQL Server реализует тип данных XML.
Обходные пути включали бы использование заполнителя вместо пробела, как говорит @Aaron. Потребитель должен помнить, чтобы вставить и раздеть эти жетоны. В качестве альтернативы определите столбец как nvarchar вместо XML. Это определенно сохранит все пробелы и любое другое форматирование. Быстрый пример:
Столбец nvarchar сохраняет формат ввода, а столбец XML - нет.
Вы потеряете возможность использовать XPATH в запросах SQL. Если XML только уничтожен в приложении, это не имеет значения. Кроме того, символьная строка может быть сжата, сохраняя место в БД, если это важно для вас.
источник
Вы можете обернуть свое пространство
CDATA
при хранении данных:Похоже, что SQL-сервер сохраняет внутреннее пространство, но удаляет ненужную
CDATA
разметку при возврате результата с помощьюSELECT
. К счастью, место сохраняется при повторном использовании результата такогоSELECT
:Результат будет:
источник