2012-05-02 63 views
7

我已成功地使用xsl模板將帶有數據的簡單xml文件轉換爲另一個xml文件(excel模板)這是我的XSL文件是什麼樣子:在xsl變換後將<?xml version =「1.0」?>添加到xml文件的頂部

<?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)... 

我這樣做變換通過窗戶下面的代碼形式:

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();,但這是不允許的。我也嘗試在網上搜索這個,並繼續回到standalone="yes",但那是行不通的。有什麼我在這裏失蹤?哦,如果你想知道爲什麼我需要有

<?xml version="1.0"?> 

在生成的文件的頂部,這是因爲打開使用Excel XML文件時,Excel不能正確識別它,但如果它被包含然後Excel打開它正確...

回答

5

你可以做到這一點

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

,或者使用與此類似XmlWriterSettings

編輯:添加了更多代碼。上一頁缺少某些部分

 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; 
     } 

這是我要做的事,但是這個代碼是專門寫來創建XmlDocument的一個實例。我相信你可以適應你的需求。

+0

感謝您的迴應MilkyWayJoe,但我已經嘗試過,現在重試了上面提到的內容,但仍不包括頂部的。你是怎麼做到的? – oUJi

+1

我真的不知道會是什麼原因。這對我有用。你認爲你可以使用'XmlWriter'而不是'XmlTextWriter'嗎?如果可以的話,那麼我會點你這個http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.outputsettings.aspx(你可能已經看到) – MilkyWayJoe

+0

天上我真對不起。請注意,我錯誤地添加了'writerSettings.OmitXmlDeclaration = true;'它應該是'false'。你可以嘗試一下,讓我知道嗎?我也會修復答案。 – MilkyWayJoe

相關問題