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.


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

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

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.


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

}   
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.