Bagaimana cara menerapkan XSLT Stylesheet di C #

190

Saya ingin menerapkan XSLT Stylesheet ke Dokumen XML menggunakan C # dan menulis output ke File.

Daren Thomas
sumber
11
Sebenarnya, saya pikir ini adalah pertanyaan yang bagus, dan Anda memberikan jawaban yang bagus. Nominasi untuk dibuka kembali.
Dominic Rodger
Saya menemukan Xslt membingungkan, jadi ini membantu saya github.com/beto-rodriguez/SuperXml
bto.rdz

Jawaban:

177

Saya menemukan jawaban yang mungkin di sini: http://web.archive.org/web/20130329123237/http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=63

Dari artikel:

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

Edit:

Tetapi kompiler terpercaya saya mengatakan, XslTransformsudah usang: Gunakan XslCompiledTransformsaja:

XPathDocument myXPathDoc = new XPathDocument(myXmlFile) ;
XslCompiledTransform myXslTrans = new XslCompiledTransform();
myXslTrans.Load(myStyleSheet);
XmlTextWriter myWriter = new XmlTextWriter("result.html",null);
myXslTrans.Transform(myXPathDoc,null,myWriter);
Daren Thomas
sumber
Karena saya mengambil beberapa jawaban Anda untuk membuat kelas yang saya tautkan, saya pikir saya akan memberikan komentar di sini. Semoga ini menyederhanakan hal-hal untuk orang-orang: dftr.ca/?p=318
DFTR
Saya lebih suka solusi ini daripada versi overload karena Anda dapat mengatur XmlReaderSettings dan XmlWriterSettings menggunakan DTD, Schemas, dll.
Alina B.
2
Saya perlu melakukan ini dalam VB.NET (yang merupakan bahasa "offspec" saya, saya lebih suka C #), dan jawaban Anda mengarah ke solusi saya. Terima kasih
Eon
137

Berdasarkan jawaban Daren yang sangat baik, perhatikan bahwa kode ini dapat dipersingkat secara signifikan dengan menggunakan XslCompiledTransform yang sesuai. Mentransformasi beban berlebih :

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

(Maaf karena menganggap ini sebagai jawaban, tetapi code blockdukungan dalam komentar agak terbatas.)

Di VB.NET, Anda bahkan tidak memerlukan variabel:

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

Berikut ini adalah tutorial tentang cara melakukan XSL Transformasi di C # di MSDN:

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

dan di sini cara menulis file:

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

seperti catatan tambahan: jika Anda ingin melakukan validasi juga di sini adalah tutorial lain (untuk DTD, XDR, dan XSD (= Skema)):

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

Saya menambahkan ini hanya untuk memberikan informasi lebih lanjut.

ManBugra
sumber
6
Ini hanya jawaban tautan. Harap sertakan bagian yang relevan dari halaman yang terhubung.
Thomas Weller
1

Ini mungkin bisa membantu Anda

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

}   
Vinod Srivastav
sumber