Исключить директиву XML из вывода XslCompiledTransform.Transform
-
20-09-2019 - |
Вопрос
я использую XsltCompiledTransform
чтобы преобразовать некоторый XML во фрагмент HTML (не полный HTML-документ, а просто DIV, который я включу в страницу, созданную где-то еще).
Преобразование я делаю следующим образом:
StringBuilder output = new StringBuilder();
XmlReader rawData = BusinessObject.GetXml();
XmlWriter transformedData = XmlWriter.Create(output);
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load("stylesheet.xslt");
transform.Transform(rawData, transformedData);
Response.Write(output.ToString());
Моя проблема в том, что результат преобразования всегда начинается с этой директивы XML:
<?xml version="1.0" encoding="utf-16"?>
Как предотвратить появление этого в моих преобразованных данных?
РЕДАКТИРОВАТЬ:
Я сообщаю XSLT, что не хочу, чтобы он выводил объявление XML с помощью
<xsl:output method="html" version="4.0" omit-xml-declaration="yes"/>
но, похоже, это не влияет на директиву, появляющуюся в моем выводе.
Интересно, что и мой источник данных XML, и мое преобразование XSLT указывают себя как UTF-8
нет UTF-16
.
ОБНОВЛЯТЬ:Кажется, что UTF-16 появляется, потому что я использую строку (строитель) в качестве механизма вывода.Когда я меняю код, чтобы использовать MemoryStream
вместо StringBuilder
, моя кодировка UTF-8 сохраняется.Я предполагаю, что это как-то связано с внутренней работой string
type и как он работает с кодировкой.
Решение
Вам нужно использовать XmlWriterSettings
объект.Установите его свойства, чтобы исключить объявление XML, и передайте его конструктору вашего XmlWriter
.
StringBuilder output = new StringBuilder();
XmlReader rawData = BusinessObject.GetXml();
XmlWriterSettings writerSettings = new XmlWriterSettings();
writerSettings.OmitXmlDeclaration = true;
using (XmlWriter transformedData = XmlWriter.Create(output, writerSettings))
{
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load("stylesheet.xslt");
transform.Transform(data, transformedData);
Response.Write(output.ToString());
}
Другие советы
Самый простой способ — добавить этот узел в ваш XSLT:
<xsl:output
method="html"
omit-xml-declaration="yes"/>