206 votes

Comment appliquer une feuille de style XSLT en C#

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

11 votes

En fait, je pense que c'est une excellente question, et vous y avez apporté une bonne réponse. Candidature pour la réouverture.

0 votes

J'ai trouvé Xslt déroutant, ce qui m'a aidé. github.com/beto-rodriguez/SuperXml

187voto

Daren Thomas Points 26812

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

Editer :

Mais mon fidèle compilateur dit, XslTransform est obsolète : Utiliser XslCompiledTransform au lieu de cela :

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

0 votes

Puisque j'ai pris une partie de votre réponse pour faire le cours que j'ai mis en lien, j'ai pensé le mettre en commentaire ici. J'espère que cela simplifiera les choses pour les gens : dftr.ca/?p=318

1 votes

Je préfère cette solution à la version surchargée parce que vous pouvez définir les éléments suivants XmlReaderSettings y XmlWriterSettings en utilisant des DTD, des schémas, etc.

2 votes

Je dois faire cela en VB.NET (qui est mon langage "offspec", je préfère C#), et votre réponse m'a conduit à ma solution. Je vous remercie de votre réponse.

147voto

Heinzi Points 66519

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

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

(Désolé d'avoir posé cette question comme une réponse, mais l'article code block est assez limité).

En VB.NET, vous n'avez même pas besoin de variable :

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

15voto

ManBugra Points 455

Voici un tutoriel sur la façon de réaliser des transformations XSL en C# sur MSDN :

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

et ici comment écrire des fichiers :

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

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

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

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

7 votes

Il s'agit d'une réponse par lien uniquement. Veuillez inclure les parties pertinentes des pages liées.

0 votes

Deux des liens sont morts.

4voto

VinodSrivastav Points 1

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

}

0voto

Mubashar Ahmad Points 2788

J'aimerais partager ce petit morceau de code qui lit une base de données et la transforme à l'aide de XSLT. En haut, j'ai également utilisé xslt-extensions ce qui le rend un peu différent des autres.

Remarque : Il s'agit d'un projet de code qui peut nécessiter un nettoyage avant d'être utilisé en production.

var schema = XDocument.Load(XsltPath);
using (var connection = new SqlConnection(ConnectionString))
{
    connection.Open();
    using (var command = new SqlCommand(Sql, connection))
    {
        var reader = command.ExecuteReader();
        var dt = new DataTable(SourceNode);
        dt.Load(reader);

        string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + Environment.NewLine;
        using (var stringWriter = new StringWriter())
        {
            dt.WriteXml(stringWriter, true);
            xml += stringWriter.GetStringBuilder().ToString();
        }

        XDocument transformedXml = new XDocument();
        var xsltArgumentList = new XsltArgumentList();
        xsltArgumentList.AddExtensionObject("urn:xslt-extensions", new XsltExtensions());

        using (XmlWriter writer = transformedXml.CreateWriter())
        {
            XslCompiledTransform xslt = new XslCompiledTransform();
            xslt.Load(schema.CreateReader());
            xslt.Transform(XmlReader.Create(new StringReader(xml)), xsltArgumentList, writer);
        }
        var result = transformedXml.ToString();
    }
}

XsltPath est le chemin d'accès à votre fichier xslt.
ConnectionString pointe vers votre base de données.
Sql est votre question.
SourceNode est le nœud de chaque enregistrement dans la source xml.

Maintenant, la partie intéressante, veuillez noter l'utilisation de urn:xslt-extensions y new XsltExtensions() dans le code ci-dessus. Vous pouvez l'utiliser si vous avez besoin d'un calcul complexe qui n'est pas possible en xslt. Voici une méthode simple pour formater une date.

public class XsltExtensions
{
    public string FormatDate(string dateString, string format)
    {
        DateTime date;

        if (DateTime.TryParse(dateString, out date))
            return date.ToString(format);

        return dateString;
    }
}

Dans un fichier XSLT, vous pouvez l'utiliser comme suit ;

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="urn:xslt-extensions">
...
<myTag><xsl:value-of select="ext:FormatDate(record_date, 'yyyy-MM-dd')"/></myTag>
...
</xsl:stylesheet>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X