在ASP.NET中执行XSLT转换的最简化方法是什么?

att*_*ack 5 c# xml asp.net xslt

换句话说,是否有更快,更简洁的方式编写以下代码:

//Create an object for performing XSTL transformations
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(HttpContext.Current.Server.MapPath("/xslt/" + xsltfile.Value), new XsltSettings(true, false), new XmlUrlResolver());

//Create a XmlReader object to read the XML we want to format
//XmlReader needs an input stream (StringReader)
StringReader sr = new StringReader(node.OuterXml);
XmlReader xr = XmlReader.Create(sr);

//Create a StringWriter object to capture the output from the XslCompiledTransform object
StringWriter sw = new StringWriter();

//Perform the transformation
xslt.Transform(xr, null, sw);

//Retrieve the transformed XML from the StringWriter object
string transformedXml = sw.ToString();
Run Code Online (Sandbox Code Playgroud)

更新(感谢目前为止的所有答案!):

对不起我的含糊:我的意思 "更快",更"简洁",我是否包括任何不必要的步骤?此外,如果有人有一个,我会喜欢更"可读"的解决方案.我在我正在开发的Web应用程序的一小部分中使用此代码,并且我将把它移动到应用程序的大部分内容中,因此我想确保它在移动之前尽可能整洁.

此外,我从静态类(在单独的数据访问类库中)获取XML,该类与数据库通信.我还会在将转换后的XML字符串发送到网页之前对其进行操作.在这种情况下,我不确定输入/响应流是否仍然可行.

还有一件事:提供的XML和XSLT可能会发生变化(应用程序的用户可以对两者进行更改),所以我想我每次都会被迫编译.

Jim*_*ert 11

这是我为我的ASP.NET做的代码,它与你的代码非常相似:

  XDocument xDoc = XDocument.Load("output.xml");

        XDocument transformedDoc = new XDocument();
        using (XmlWriter writer = transformedDoc.CreateWriter())
        {
            XslCompiledTransform transform = new XslCompiledTransform();
            transform.Load(XmlReader.Create(new StreamReader("books.xslt")));
            transform.Transform(xDoc.CreateReader(), writer);
        }

        // now just output transformedDoc
Run Code Online (Sandbox Code Playgroud)


Dir*_*mar 7

如果您有一个大型XSLT,则可以在构建项目时通过将XSLT编译为.NET程序集来节省在运行时编译它的开销(例如,作为构建后步骤).执行此操作的编译器被调用,xsltc.exe并且是Visual Studio 2008的一部分.

为了加载这样的预编译XSLT,您需要在服务器上安装.NET Framework 2.0 SP1或更高版本(该功能随SP1一起引入).

有关示例,请查看Anton Lapounov的博客文章:

XSLTC - 将XSLT编译为.NET程序集

如果预编译XSLT不是一个选项,您应该考虑在加载后对其进行缓存,XslCompiledTransform这样您就不必在每次要执行转换时都编译它.