2010-08-10 46 views
0

前幾天我剛剛瞭解了XSL和XSLT,現在我試圖基於我今天早些時候使用的question(希望在我的網站上顯示了格式化的XML)。需要幫助在ASP.NET MVC中執行從XML到HTML的XSL轉換

這是我想要的代碼(在視圖中):

XDocument xmlInput = XDocument.Parse(item.Action); 
XDocument htmlOutput = new XDocument(); 

using (System.Xml.XmlWriter writer = xmlInput.CreateWriter()) 
{      
    // Load Transform 
    System.Xml.Xsl.XslCompiledTransform toHtml = new System.Xml.Xsl.XslCompiledTransform(); 
    string path = HttpContext.Current.Server.MapPath("~/App_Data/xmlverbatimwrapper.xsl"); 
    toHtml.Load(path); 

    // Execute 
    toHtml.Transform(xmlInput.CreateReader(), writer);    
} 

Response.Write(htmlOutput.ToString()); 

而且它給我這個錯誤:

[InvalidOperationException: This operation would create an incorrectly structured document.] 

如果沿着正確的路線是不知道,但我已經嘗試修改編寫器設置,以便它可以生成零碎的xml文件,但沒有運氣(因爲它是隻讀的)。任何想法得到這個工作?也許我正在完全錯誤的做法? :)

感謝您的幫助!

回答

1

我得到了上面的代碼通過查看工作在this site

我最終使用的代碼(這是從鏈接複製上面有我的具體情況進行一些更改)是:

String TransactionXML = item.Action;  

System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument(); 
System.IO.Stream xmlStream; 
System.Xml.Xsl.XslCompiledTransform xsl = new System.Xml.Xsl.XslCompiledTransform(); 
ASCIIEncoding enc = new ASCIIEncoding(); 
System.IO.StringWriter writer = new System.IO.StringWriter(); 

// Get Xsl and XML 
xsl.Load(HttpContext.Current.Server.MapPath("~/App_Data/xmlverbatimwrapper.xsl")); 
xmlDoc.LoadXml(TransactionXML); 

// Get the bytes 
xmlStream = new System.IO.MemoryStream(enc.GetBytes(xmlDoc.OuterXml), true); 

// Load Xpath document 
System.Xml.XPath.XPathDocument xp = new System.Xml.XPath.XPathDocument(xmlStream); 

// Perform Transform 
xsl.Transform(xp, null, writer); 

// output 
Response.Write(writer.ToString()); 

希望這可以幫助別人! :)

0

只是一個猜測,但有效的HTML不一定是有效的XML,而您使用的是一個名爲XmlWriter的類。沒有看到你的XSL並輸入XML,很難弄清楚發生了什麼。我懷疑你的輸出文檔不是格式良好的XML。

我想你需要提供一個不同的Writer實現,可以處理HTML輸出。

+0

我認爲有一種方法來設置作家的屬性,以便它會產生零碎的XML而不是一個完整的文檔,你認爲只是當前的一個設置將工作? – Evan 2010-08-11 17:06:13

+0

對不起,這是我的知識領域的出路:-)嘗試一下,看看。您還應該單獨運行XSL轉換,將輸出寫入文件,並檢查輸出是否符合您的期望。 – 2010-08-11 18:11:29

+0

請注意,您可以使用XmlOutputMethod枚舉和XmlWriterSettings對象將HTML指定爲輸出方法。爲此,您必須使用Create(...)靜態方法顯式創建編寫器,而不是從XDocument獲取編寫器。 – 2010-08-11 18:17:10