Cách áp dụng Biểu định kiểu XSLT trong C #


190

Tôi muốn áp dụng Biểu định kiểu XSLT cho Tài liệu XML bằng C # và ghi kết quả đầu ra vào Tệp.


11
Trên thực tế, tôi nghĩ rằng đây là một câu hỏi tuyệt vời, và bạn đã cung cấp một câu trả lời tốt. Đề cử để mở lại.
Đaminh Rodger

Tôi thấy Xslt khó hiểu, vì vậy điều này đã giúp tôi github.com/beto-rodriguez/SuperXml
bto.rdz

Câu trả lời:


177

Tôi đã tìm thấy một câu trả lời có thể có tại đây: http://web.archive.org/web/20130329123237/http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=63

Từ bài viết:

XPathDocument myXPathDoc = new XPathDocument(myXmlFile) ;
XslTransform myXslTrans = new XslTransform() ;
myXslTrans.Load(myStyleSheet);
XmlTextWriter myWriter = new XmlTextWriter("result.html",null) ;
myXslTrans.Transform(myXPathDoc,null,myWriter) ;

Biên tập:

Nhưng trình biên dịch đáng tin cậy của tôi nói, XslTransformđã lỗi thời: Sử dụng XslCompiledTransformthay thế:

XPathDocument myXPathDoc = new XPathDocument(myXmlFile) ;
XslCompiledTransform myXslTrans = new XslCompiledTransform();
myXslTrans.Load(myStyleSheet);
XmlTextWriter myWriter = new XmlTextWriter("result.html",null);
myXslTrans.Transform(myXPathDoc,null,myWriter);

Vì tôi đã lấy một số câu trả lời của bạn để tạo ra lớp mà tôi đang liên kết, tôi nghĩ tôi sẽ đặt nó như một nhận xét ở đây. Hy vọng nó đơn giản hóa mọi thứ cho mọi người: dftr.ca/?p=318
DFTR

Tôi thích giải pháp này thay vì phiên bản quá tải vì bạn có thể đặt XmlReaderSinstallXmlWriterSinstall bằng DTD, Schemas, v.v.
Alina B.

2
Tôi cần phải làm điều này trong VB.NET (là ngôn ngữ "offspec" của tôi, tôi thích C #) và câu trả lời của bạn đã dẫn đến giải pháp của tôi. Cảm ơn
Eon

137

Dựa trên câu trả lời tuyệt vời của Daren, lưu ý rằng mã này có thể được rút ngắn đáng kể bằng cách sử dụng quá tải XslCompiledTransform.Transform thích hợp :

var myXslTrans = new XslCompiledTransform(); 
myXslTrans.Load("stylesheet.xsl"); 
myXslTrans.Transform("source.xml", "result.html"); 

(Xin lỗi vì đặt câu hỏi này như một câu trả lời, nhưng sự code blockhỗ trợ trong các bình luận khá hạn chế.)

Trong VB.NET, bạn thậm chí không cần một biến:

With New XslCompiledTransform()
    .Load("stylesheet.xsl")
    .Transform("source.xml", "result.html")
End With

16

Dưới đây là hướng dẫn về cách thực hiện Chuyển đổi XSL trong C # trên MSDN:

http://support.microsoft.com/kb/307322/en-us/

và đây là cách viết tập tin:

http://support.microsoft.com/kb/816149/vi-us

chỉ là một lưu ý phụ: nếu bạn cũng muốn xác thực thì đây là một hướng dẫn khác (dành cho DTD, XDR và ​​XSD (= Schema)):

http://support.microsoft.com/kb/307379/en-us/

tôi đã thêm điều này chỉ để cung cấp thêm một số thông tin.


6
Đây là một câu trả lời chỉ liên kết. Vui lòng bao gồm các phần có liên quan của các trang được liên kết.
Thomas Weller

1

Điều này có thể giúp bạn

public static string TransformDocument(string doc, string stylesheetPath)
{
    Func<string,XmlDocument> GetXmlDocument = (xmlContent) =>
     {
         XmlDocument xmlDocument = new XmlDocument();
         xmlDocument.LoadXml(xmlContent);
         return xmlDocument;
     };

    try
    {
        var document = GetXmlDocument(doc);
        var style = GetXmlDocument(File.ReadAllText(stylesheetPath));

        System.Xml.Xsl.XslCompiledTransform transform = new System.Xml.Xsl.XslCompiledTransform();
        transform.Load(style); // compiled stylesheet
        System.IO.StringWriter writer = new System.IO.StringWriter();
        XmlReader xmlReadB = new XmlTextReader(new StringReader(document.DocumentElement.OuterXml));
        transform.Transform(xmlReadB, null, writer);
        return writer.ToString();
    }
    catch (Exception ex)
    {
        throw ex;
    }

}   
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.