在xsl变换之后,将<?xml version =“1.0”?>添加到xml文件的顶部

我已经成功地使用xsl模板将具有数据的简单xml文件转换为另一个xml文件(excel模板),这就是我的xsl文件的样子:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" standalone="yes"/> <xsl:template match="/"> <xsl:processing-instruction name="mso-application"> <xsl:text>progid="Excel.Sheet"</xsl:text> </xsl:processing-instruction> ...(stuff here)... </xsl:template> </xsl:stylesheet> 

生成的xml文件写出正确,但包括除外

 <?xml version="1.0"?> 

在文件的顶部。 我怎样才能让它出现在顶部?

目前我的结果XML文件开始于:

 <?mso-application progid="Excel.Sheet"?> ...(rest of file)... 

但是我需要做的是:

 <?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> .(rest of file)... 

我正在做这个变换通过一个Windows窗体与下面的代码:

 XPathDocument myXPathDoc = new XPathDocument(xmlfile); XslCompiledTransform myXslTrans = new XslCompiledTransform(); myXslTrans.Load(xslfile); XmlTextWriter myWriter = new XmlTextWriter(xmlexcelfile, null); myWriter.Formatting = Formatting.Indented; myWriter.Namespaces = true; myXslTrans.Transform(myXPathDoc, null, myWriter); myWriter.Close(); 

我尝试过使用xsl:output standalone="yes/no" ,以及omit-xml-declaration="no" 。 我也试过(在C#中)添加myWriter.WriteStartDocument(); 在转换之前,但这是不允许的。 我也尝试在网上search这个以及继续回到standalone="yes"但是这是行不通的。 有什么我在这里失踪? 哦,如果你想知道为什么我需要这个

 <?xml version="1.0"?> 

在生成的文件的顶部,这是因为当用excel打开xml文件时,excel不能正确识别它,但是如果它被包含然后excel打开它正确…

你可以这样做

 <xsl:output method="xml" indent="yes" omit-xml-declaration="no" /> 

或者类似于这个使用XmlWriterSettings

编辑 :添加更多的代码。 以前是缺less一些部分

  XmlWriterSettings writerSettings = null; XsltArgumentList transformationArguments = null; XslCompiledTransform transformer = null; MemoryStream memoryStream = null; XPathDocument xPathDocument = null; StringBuilder sb = null; XmlWriter writer = null; XmlDocument resultXml = null; try { writerSettings = new XmlWriterSettings(); writerSettings.OmitXmlDeclaration = false; // This does it writerSettings.Indent = true; transformationArguments = new XsltArgumentList(); transformer = new XslCompiledTransform(); memoryStream = new MemoryStream(System.Text.Encoding.Default.GetBytes(xml.OuterXml)); xPathDocument = new XPathDocument(new StreamReader(memoryStream)); sb = new StringBuilder(); // give the settings to the writer here writer = XmlWriter.Create(sb, writerSettings); // this is not mandatory, obviously, just passing parameters to my xslt file foreach (KeyValuePair<string, object> parameter in parameters) { transformationArguments.AddParam(parameter.Key, string.Empty, parameter.Value); } using (Stream strm = Assembly.GetExecutingAssembly().GetManifestResourceStream("Lib.XSLTFile1.xslt")) using (XmlReader reader = XmlReader.Create(strm)) { transformer.Load(reader); transformer.Transform(xPathDocument, transformationArguments, writer); } resultXml = new XmlDocument(); resultXml.LoadXml(sb.ToString()); // for testing only File.AppendAllText(@"Your path goes here\result.xml", resultXml.OuterXml); } catch (Exception) { throw; } 

这是我如何做的,但是这个代码是专门编写来创build一个XmlDocument的实例。 我相信你可以适应你的需求。