So wenden Sie ein XSLT-Stylesheet in C # an


190

Ich möchte ein XSLT-Stylesheet mit C # auf ein XML-Dokument anwenden und die Ausgabe in eine Datei schreiben.


11
Eigentlich denke ich, dass dies eine großartige Frage ist, und Sie haben eine gute Antwort gegeben. Nominierung für die Wiedereröffnung.
Dominic Rodger

Ich fand Xslt verwirrend, also half mir das github.com/beto-rodriguez/SuperXml
bto.rdz

Antworten:


177

Ich habe hier eine mögliche Antwort gefunden: http://web.archive.org/web/20130329123237/http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=63

Aus dem 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) ;

Bearbeiten:

Aber mein vertrauenswürdiger Compiler sagt, XslTransformist veraltet: Verwenden Sie XslCompiledTransformstattdessen:

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

Da ich einige Ihrer Antworten verwendet habe, um die Klasse zu erstellen, auf die ich verlinke, dachte ich, ich würde sie hier als Kommentar einfügen. Hoffentlich vereinfacht es die Dinge für die Menschen: dftr.ca/?p=318
DFTR

Ich bevorzuge diese Lösung anstelle der überladenen Version, da Sie XmlReaderSettings und XmlWriterSettings mithilfe von DTD, Schemas usw. festlegen können.
Alina B.

2
Ich muss dies in VB.NET tun (das ist meine "Offspec" -Sprache, ich bevorzuge C #), und Ihre Antwort führte zu meiner Lösung. Vielen Dank
Eon

137

Beachten Sie, dass dieser Code auf der Grundlage der hervorragenden Antwort von Daren durch die Verwendung der entsprechenden XslCompiledTransform.Transform-Überladung erheblich verkürzt werden kann :

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

(Entschuldigen Sie, dass Sie dies als Antwort angegeben haben, aber die code blockUnterstützung in Kommentaren ist eher begrenzt.)

In VB.NET benötigen Sie nicht einmal eine Variable:

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

16

Hier ist ein Tutorial zum Ausführen von XSL-Transformationen in C # auf MSDN:

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

und hier, wie man Dateien schreibt:

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

Nur als Randnotiz: Wenn Sie auch eine Validierung durchführen möchten, finden Sie hier ein weiteres Tutorial (für DTD, XDR und XSD (= Schema)):

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

Ich habe dies hinzugefügt, um weitere Informationen bereitzustellen.


6
Dies ist eine reine Linkantwort. Bitte fügen Sie die relevanten Teile der verlinkten Seiten hinzu.
Thomas Weller

1

Dies könnte Ihnen helfen

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

}   
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.