Como aplicar uma folha de estilo XSLT em c #

190

Quero aplicar uma folha de estilo XSLT a um documento XML usando c # e gravar a saída em um arquivo.

Daren Thomas
fonte
11
Na verdade, acho que essa é uma ótima pergunta e você forneceu uma boa resposta. Indicar para reabrir.
Dominic Rodger
Eu encontrei Xslt confuso, então isso me ajudou github.com/beto-rodriguez/SuperXml
bto.rdz

Respostas:

177

Encontrei uma resposta possível aqui: http://web.archive.org/web/20130329123237/http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=63

Do artigo:

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

Editar:

Mas meu fiel compilador diz que XslTransformé obsoleto: use XslCompiledTransform:

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
fonte
Desde que peguei algumas de suas respostas para fazer a classe à qual estou vinculando, pensei em colocá-las como comentário aqui. Espero que isso simplifique as coisas para as pessoas: dftr.ca/?p=318
DFTR 25/13
Eu prefiro esta solução em vez da versão sobrecarregado, porque você é capaz de definir XmlReaderSettings e XmlWriterSettings usando DTD, esquemas, etc.
Alina B.
2
Eu preciso fazer isso no VB.NET (que é o meu idioma "offspec", prefiro C #), e sua resposta levou à minha solução. Obrigado
Eon
137

Com base na excelente resposta de Daren, observe que esse código pode ser reduzido significativamente usando a sobrecarga XslCompiledTransform.Transform apropriada :

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

(Desculpe por colocar isso como uma resposta, mas o code blocksuporte nos comentários é bastante limitado.)

No VB.NET, você nem precisa de uma variável:

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

Aqui está um tutorial sobre como fazer transformações XSL em C # no MSDN:

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

e aqui como escrever arquivos:

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

apenas como uma observação lateral: se você quiser fazer a validação também, aqui está outro tutorial (para DTD, XDR e XSD (= Esquema)):

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

Eu adicionei isso apenas para fornecer mais algumas informações.

ManBugra
fonte
6
Esta é uma resposta apenas para link. Inclua as partes relevantes das páginas vinculadas.
21415 Thomas Thomas $
1

Isso pode ajudá-lo

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
fonte