2009-11-16 14 views
6

Sto utilizzando un XsltCompiledTransform per trasformare alcuni XML in un frammento di HTML (non un documento HTML completo, solo un DIV che includerò nella pagina generata altrove).Escludi la direttiva XML da XslCompiledTransform.Transform output

che sto facendo la trasformazione come segue:

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 posso evitare questo di apparire nei miei dati trasformati?

EDIT:

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 la mia uscita.

È interessante notare che sia la mia origine dati XML sia la mia trasformazione XSLT si specificano 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 anziché uno StringBuilder, la codifica UTF-8 viene mantenuta. Immagino che questo abbia qualcosa a che fare con il funzionamento interno del tipo string e come si occupa della codifica.

risposta

14

è necessario utilizzare un oggetto XmlWriterSettings. Imposta le sue proprietà per omettere la dichiarazione XML e passala al costruttore del tuo 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()); 
} 
+0

Sì, questa è la strada da percorrere. Non è un problema XSLT - la dichiarazione è scritta da 'XmlWriter' in primo luogo, non da' XslCompiledTransform'. –

+0

Ma perché XmlWriter non prende le sue impostazioni dall'XSLT? – kristian

+1

Perché una volta creato, non può modificare le sue impostazioni in base alla progettazione. Quindi, una volta che XSLT lo riceve, non può davvero fare nulla al riguardo. Se usi un overload 'Transform()' che accetta un 'TextWriter' o' Stream', creerà un 'XmlWriter' con le impostazioni corrette per te. –

3

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

<xsl:output 
    method="html" 
    omit-xml-declaration="yes"/> 
+1

È interessato solo all'HTML, quindi dovrei usare method = "html" e forse version = "somehtmlversion". – Gonzalo

+0

@Andrew - mi dispiace, questo non funziona. @Gonzalo - sì, è esattamente quello che sto facendo – kristian

+0

Sì, buon punto - Ho aggiornato la mia risposta. –