Применить XSLT к XML в памяти и вернуть XML в памяти - PullRequest
4 голосов
/ 18 мая 2010

Я ищу статическую функцию в .NET Framework, которая принимает фрагмент XML и файл XSLT, применяет преобразование в памяти и возвращает преобразованный XML.

Я хотел бы сделать это:

string rawXml = invoiceTemplateDoc.MainDocumentPart.Document.InnerXml;
rawXml = DoXsltTransformation(rawXml, @"c:\prepare-invoice.xslt"));

// ... do more manipulations on the rawXml

В качестве альтернативы, вместо того, чтобы принимать и возвращать строки, он мог бы принимать и возвращать XmlNodes.

Есть ли такая функция?

Ответы [ 3 ]

7 голосов
/ 18 мая 2010

Вы можете использовать классы StringReader и StringWriter:

string input = "<?xml version=\"1.0\"?> ...";
string output;
using (StringReader sReader = new StringReader(input))
using (XmlReader xReader = XmlReader.Create(sReader))
using (StringWriter sWriter = new StringWriter())
using (XmlWriter xWriter = XmlWriter.Create(sWriter))
{
    XslCompiledTransform xslt = new XslCompiledTransform();
    xslt.Load("transform.xsl");
    xslt.Transform(xReader, xWriter);
    output = sWriter.ToString();
}
5 голосов
/ 18 мая 2010

Немного известной особенностью является то, что вы можете фактически преобразовывать данные непосредственно в XmlDocument DOM или в LINQ-to-XML XElement или XDocument (с помощью метода CreateWriter()) без необходимости проходить текстовую форму, получая экземпляр XmlWriter для передачи им данных.

Предполагая, что ваш ввод XML IXPathNavigable и вы загрузили экземпляр XslCompiledTransform, вы можете сделать следующее:

XmlDocument target = new XmlDocument(input.CreateNavigator().NameTable);
using (XmlWriter writer = target.CreateNavigator().AppendChild()) {
  transform.Transform(input, writer);
}

Затем у вас есть преобразованный документ в документе taget. Обратите внимание, что в transform имеются другие перегрузки, позволяющие передавать аргументы и расширения XSLT в таблицу стилей.

Если вы хотите, вы можете написать свой собственный статический вспомогательный метод или метод расширения для выполнения преобразования по мере необходимости. Однако может быть хорошей идеей кэшировать преобразование, поскольку его загрузка и компиляция не бесплатны.

1 голос
/ 18 мая 2010

Вы заметили, что есть XsltCompiledTransform класс ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...