Comment appliquer une feuille de style XSLT en C #

190

Je veux appliquer une feuille de style XSLT à un document XML en utilisant C # et écrire la sortie dans un fichier.

Daren Thomas
la source
11
En fait, je pense que c'est une excellente question, et vous avez fourni une bonne réponse. Mise en candidature pour la réouverture.
Dominic Rodger
J'ai trouvé Xslt déroutant, donc cela m'a aidé github.com/beto-rodriguez/SuperXml
bto.rdz

Réponses:

177

J'ai trouvé une réponse possible ici: http://web.archive.org/web/20130329123237/http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=63

Extrait de l'article:

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

Éditer:

Mais mon fidèle compilateur dit, XslTransformest obsolète: utilisez à la XslCompiledTransformplace:

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
la source
Depuis que j'ai pris une partie de votre réponse pour créer le cours auquel je suis lié, j'ai pensé que je la mettrais en commentaire ici. Espérons que cela simplifie les choses pour les gens: dftr.ca/?p=318
DFTR
Je préfère cette solution à la version surchargée car vous pouvez définir XmlReaderSettings et XmlWriterSettings à l' aide de DTD, de schémas, etc.
Alina B.
2
Je dois le faire en VB.NET (qui est mon langage "offspec", je préfère C #), et votre réponse a conduit à ma solution. Merci
Eon
137

Sur la base de l'excellente réponse de Daren, notez que ce code peut être raccourci de manière significative en utilisant la surcharge XslCompiledTransform.Transform appropriée :

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

(Désolé de poser cela comme une réponse, mais le code blocksupport dans les commentaires est plutôt limité.)

Dans VB.NET, vous n'avez même pas besoin d'une variable:

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

Voici un didacticiel expliquant comment effectuer des transformations XSL en C # sur MSDN:

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

et voici comment écrire des fichiers:

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

juste en remarque: si vous voulez faire de la validation aussi, voici un autre tutoriel (pour DTD, XDR et XSD (= Schema)):

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

J'ai ajouté ceci juste pour fournir plus d'informations.

HommeBugra
la source
6
Ceci est une réponse par lien uniquement. Veuillez inclure les parties pertinentes des pages liées.
Thomas Weller
1

Cela pourrait vous aider

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
la source