2011-12-08 49 views
0

嘗試將代碼中生成的XML轉換爲純文本輸出時,我總是收到上述錯誤。XML轉換錯誤 - 指定的節點不能作爲此節點的有效子節點插入,因爲指定的節點類型不正確

我的.xsl文件是:

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
     <xsl:template match="/"> 
      <xsl:text>Test</xsl:text> 
     </xsl:template> 
</xsl:transform> 

而且我的C#方法的代碼是:

 if(!File.Exists(xslPath)) 
      throw new Exception("XSL File (" + xslPath + ") does not exist"); 

     XslTransform docXsl = new XslTransform(); 
     docXsl.Load(xslPath); 

     XmlDocument docXml = new XmlDocument(); 

     XmlElement emailNode = docXml.CreateElement("Email"); 
     docXml.AppendChild(emailNode); 

     XmlResolver xres = null; 
     XmlReader xr = docXsl.Transform(docXml, null, xres); 

     XmlDocument xmldoc = new XmlDocument(); 
     xmldoc.Load(xr); 

     return xmldoc.OuterXml; 

生成的XML是非常簡單,只需

<Email/> 

如果我刪除來自XSL的節點,那麼我不會收到錯誤。

我找不到爲什麼會發生這種情況。任何幫助將不勝感激。

謝謝

回答

0

你想達到什麼目的?如果您使用.NET 2.0或更高版本,則根本不應使用XslTransform,而應使用XslCompiledTransform。如果你想要純文本輸出,那麼嘗試將該轉換結果加載到XmlDocument中沒有任何意義,因爲該對象模型旨在包含格式良好的XML文檔而不是某些純文本。所以這就是我認爲你得到錯誤的原因,你的轉換結果是帶有單個文本節點的純文本,然後嘗試將單個文本節點加載到查找不存在根元素的XmlDocument中。 請考慮告訴您使用哪個.NET版本/目標以及您需要的輸出類型(例如純文本文件或帶有轉換結果的字符串),然後我們可以指出正確的重載XslCompiledTransform http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.transform.aspx的Transform方法得到那個結果。

舉例來說,如果你的轉換輸入一個XmlDocument或其他物體實施IXPathNavigable可以使用http://msdn.microsoft.com/en-us/library/ms163435.aspx轉換到的StringWriter如下得到一個字符串結果:

XslCompiledTransform proc = new XslCompiledTransform(); 
proc.Load(xslPath); 

string result; 

using (StringWriter sw = new StringWriter()) 
{ 
    proc.Transform(docXml, null, sw); 
    result = sw.toString(); 
} 

return result; 
+0

謝謝!這正是我需要的。很好的解釋,並使我找到了一個可行的解決方案。我在XSL中保存純文本模板來發送電子郵件,並根據XML文件填充模板。 – ExceptionEx

相關問題