Exclure directive XML de sortie XslCompiledTransform.Transform
-
20-09-2019 - |
Question
J'utilise un XsltCompiledTransform
pour transformer du XML en un fragment de HTML (et non un document HTML complet, juste un DIV que je vais inclure dans la page générée ailleurs).
Je fais la transformation comme suit:
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());
Mon problème est que le résultat de la transformation commence toujours par cette directive XML:
<?xml version="1.0" encoding="utf-16"?>
Comment empêcher cela d'apparaître dans mes données transformées?
EDIT:
Je dis la XSLT que je ne veux pas qu'il produire une déclaration xml avec
<xsl:output method="html" version="4.0" omit-xml-declaration="yes"/>
mais cela semble avoir aucun effet sur la directive apparaissant dans ma sortie.
Il est intéressant, à la fois ma source de données XML et ma transformation XSLT se PRÉCISE UTF-8
pas UTF-16
.
Mise à jour:
L'UTF-16 semble apparaître parce que je suis en utilisant une chaîne (constructeur) en tant que mécanisme de sortie. Quand je change le code d'utiliser un MemoryStream
au lieu d'un StringBuilder
, mon encodage UTF-8 est préservée. Je devine que cela a quelque chose à voir avec le fonctionnement interne du type string
et la façon dont il traite le codage.
La solution
Vous devez utiliser un objet XmlWriterSettings
. Définissez ses propriétés d'omettre la déclaration XML, et le transmettre au constructeur de votre 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());
}
Autres conseils
La façon la plus simple serait d'ajouter ce nœud à votre XSLT:
<xsl:output
method="html"
omit-xml-declaration="yes"/>