Як застосувати таблицю стилів XSLT у C #


190

Я хочу застосувати таблицю стилів XSLT до XML-документа за допомогою C # і записати вихід у файл.


11
Власне, я вважаю, що це чудове питання, і ви дали хорошу відповідь. Номінація на повторне відкриття.
Домінік Роджер

Я визнав Xslt заплутаним, тому це допомогло мені github.com/beto-rodriguez/SuperXml
bto.rdz

Відповіді:


177

Тут я знайшов можливу відповідь: http://web.archive.org/web/20130329123237/http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=63

Зі статті:

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

Редагувати:

Але мій довірливий компілятор каже, XslTransformзастарілий: використовуйте 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);

Оскільки я взяв частину вашої відповіді, щоб скласти клас, до якого я посилаюсь, подумав, що я ставлю це як коментар. Сподіваємось, це спрощує речі для людей: dftr.ca/?p=318
DFTR

Я вважаю за краще це рішення замість перевантаженої версії, тому що ви можете встановити XmlReaderSettings та XmlWriterSettings за допомогою DTD, схем тощо
Alina B.

2
Мені потрібно це зробити у VB.NET (що є моєю "offspec" мовою, я віддаю перевагу C #), і ваша відповідь призвела до мого рішення. Спасибі
Eon

137

Виходячи з чудової відповіді Дарена, зауважте, що цей код можна значно скоротити за допомогою відповідної перевантаження XslCompiledTransform.Transform :

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

(Вибачте за те, що ви поставили це як відповідь, але code blockпідтримка в коментарях досить обмежена.)

У VB.NET вам навіть не потрібна змінна:

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

16

Ось підручник про те, як робити XSL-перетворення в C # на MSDN:

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

і ось як записати файли:

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

як бічна примітка: якщо ви теж хочете перевірити, ще один підручник (для DTD, XDR та XSD (= схема)):

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

я додав це лише для надання трохи більше інформації.


6
Це відповідь лише за посиланням. Будь ласка, включіть відповідні частини пов'язаних сторінок.
Томас Веллер

1

Це може вам допомогти

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

}   
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.