在内存中的XML上应用XSLT并返回内存中的XML

Jan*_*m B 4 .net c# xml xslt

我正在寻找.NET框架中的静态函数,它接受XML片段和XSLT文件,在内存中应用转换,并返回转换后的XML.

我想这样做:

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

// ... do more manipulations on the rawXml
Run Code Online (Sandbox Code Playgroud)

或者,它可以取出并返回XmlNodes,而不是获取和返回字符串.

有这样的功能吗?

Tho*_*que 7

你可以使用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();
}
Run Code Online (Sandbox Code Playgroud)


Luc*_*ero 5

有一点知道的特点是,你可以在实际上转换数据直接进入一个XmlDocumentDOM或成LINQ到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);
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在文档中包含已转换的taget文档.请注意,还有其他重载transform允许您将XSLT参数和扩展传递到样式表中.

如果需要,您可以编写自己的静态助手或扩展方法,以根据需要执行转换.但是,缓存转换可能是个好主意,因为加载和编译它不是免费的.