Domanda

sto usando un XsltCompiledTransform per trasformare alcuni XML in un frammento di codice HTML (non un documento HTML completo, solo un DIV che io includere nella pagina generata altrove).

che sto facendo la trasformazione nel modo seguente:

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());

Il mio problema è che il risultato della trasformazione sempre inizia con questa direttiva XML:

<?xml version="1.0" encoding="utf-16"?>

Come faccio a evitare che ciò che appare nei miei dati trasformati?

Modifica

sto dicendo la XSLT che io non voglio che in uscita una dichiarazione XML con

<xsl:output method="html" version="4.0" omit-xml-declaration="yes"/>

, ma questo sembra non avere alcun effetto sulla direttiva che appaiono nelle mia uscita.

È interessante notare che sia la mia fonte di dati XML e XSLT mia trasformano specificare se stessi come UTF-8 non UTF-16.

UPDATE: L'UTF-16 sembra essere apparire perché sto utilizzando una stringa (costruttore) come meccanismo di uscita. Quando cambio il codice per utilizzare un MemoryStream invece di un StringBuilder, il mio codifica UTF-8 è conservato. Sto indovinando questo ha qualcosa a che fare con il funzionamento interno del tipo string e come si tratta con la codifica.

È stato utile?

Soluzione

È necessario utilizzare un oggetto XmlWriterSettings. Impostare le proprietà di omettere la dichiarazione XML, e passarlo al costruttore del vostro 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());
}

Altri suggerimenti

Il modo più semplice sarebbe quella di aggiungere questo nodo per il vostro XSLT:

<xsl:output 
    method="html" 
    omit-xml-declaration="yes"/>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top