\t\t使用 Visual C#.NET,XSL转换应用到XML文档

来源:互联网 发布:linux 退不出vi 编辑:程序博客网 时间:2024/05/04 10:34

System.Xml.Xsl 命名空间中的 XslTransform 类实现.NET 框架 XSLT 处理器。 创建和使用.NET 应用程序中执行 XSLT 转换此类的实例的对象。 XSLT 处理器在.NET 框架中的实现是符合 W3C XSLT Recommendation (http://www.w3.org/TR/xslt) 的版本 1.0。

System.Xml.Xsl 命名空间还实现了以下类支持 XSLT 异常处理和 XSLT 转换和 XPath 查询的执行相关的高级的选项:

  • XsltArgumentList 。 可以使用此类的对象实例提供扩展的对象实例和 XSLT 参数的 XSLT 样式表定义和引用的值。
  • XsltCompileException 。 此类生成.NET 异常时正在编译的 XSLT 样式表发生错误时。 XslTransform 对象的 Load 方法执行时编译的 XSLT 样式表。
  • XsltException 。 此类生成.NET 异常时要执行 XSLT 转换,将发生运行时错误时。
  • XsltContext IXsltContextFunction IXsltContextVariable 。 这些高级组件所要求实现和引用用户定义的函数和变量中使用 XPathNavigator 类和文档对象模型 (DOM) 类在.NET 应用程序中执行的 XPath 查询时实现一个自定义的 XPath 查询执行上下文。

    要在包含在 XSLT 样式表中的 XPath 查询表达式中更容易地实现用户定义的函数和变量,您可以使用嵌入式脚本块、 扩展的对象和 XSLT 变量或参数。

XSLT 的高级的功能

本节描述几个高级的 XSLT 功能。

管道的 XSLT 转换

管道是指通过增量应用两个或多个 XSLT 样式表转换将源 XML 文档的过程。 每个中间阶段生成的输出作为输入下一阶段提供一直为最终阶段然后生成相应的输出。

此方法时,必须保持未直接绑定到转换过程的其他处理的生成的中间阶段的输出。 和其他信息有关此主题的代码示例阐释了其用法的请单击下面将文章编号,以查看 Microsoft 知识库中相应的文章:

320847 (http://support.microsoft.com/kb/320847/EN-US/ ) 如何: 管道.NET 应用程序中的 XSLT 转换

参数化的 XSLT 转换

一个常见的 XSLT 做法来定义并使用样式表中的参数是。 参数化的 XSLT 样式表定义有选择地定位和转换 XML 数据源中的节点的 XPath 查询表达式中的引用的参数使用 <xsl:param> 元素。 已定义参数的值可以硬编码在样式表中或在运行时提供。 后一练习中的动态提供控制转换过程的输入的参数值是此功能的最常见用法。

在.NET 的应用程序中 XsltArgumentList 对象用于提供执行时的 XSLT 参数的值。 将 AddParam 使用方法将名称-值对表示样式表和它的值的 XsltArgumentList 对象中定义一个参数。 然后 XsltArgumentList 对象时执行 XslTransform 对象用来执行转换的 转换 方法提供作为参数。

GetParam RemoveParam 方法用于访问并删除添加到 XsltArgumentList 对象中的单个参数。 有关如何在.NET 应用程序中执行参数化的 XSLT 转换,请单击下面将文章编号,以查看 Microsoft 知识库中相应的文章:

321704 (http://support.microsoft.com/kb/321704/EN-US/ ) 如何: 在.NET 应用程序中执行参数化的 XSL 转换

嵌入式脚本块

内联脚本函数将是一选项的使用可以实现用户定义的函数和子在 XSLT 样式表中使用的 XPath 查询表达式中引用的过程。 能够在 XSLT 样式表的嵌入式脚本块是 W3C 扩展。

在.NET Framework 中,自定义的内联函数和子例程编码 <msxsl:script> XSLT 样式表中的块中。 可以使用一个 Microsoft Visual Studio.NET 编程语言 (如 Microsoft Visual Basic.NET 或 Microsoft Visual C#.NET 实现这些例程。

使用嵌入式脚本块相关联的缺点是它们使 XSLT 样式表不可移植。 技术,标记,用于实现嵌入式脚本块的语义是 W3C XSLT 规范执行不标准化的特定供应商扩展。

您可以只使用 XSLT 样式表定义,并转换中使用的 XSLT 处理器执行的可以解释相关的语义和使用具有执行该代码的技术集成中成功使用嵌入式脚本块。

在.NET 框架托管程序集生成而隐式加载内联 <msxsl:script> 执行代码所包含的脚本块。 阻止来自被正确转换过程完成后卸载这些程序集的.NET 框架中目前已知的问题。 如果重复受影响的样式表加载到执行 XSLT 转换增加内存使用情况可能导致此异常。 仅在主机进程被回收时,将释放未发布的内存。 有关此问题,在.NET Framework 中,请单击下面将文章编号,以查看 Microsoft 知识库中相应的文章:

316775 (http://support.microsoft.com/kb/316775/EN-US/ ) PRB: 不能卸载您创建和使用 XSLT 中的脚本加载的程序集

要解决此问题,Microsoft ASP.NET 应用程序中锛岃,可以加载一次,在应用程序的生命周期过程中受影响的样式表、 缓存 (在 ASP.NET 缓存) 中受影响的样式表,然后重新缓存的版本转换为使用后的。

在 Windows 窗体和控制台应用程序,可以使用全局 XslTransform 对象实例,将应用程序启动时加载受影响的样式表以及执行更高版本的转换。

XSLT 扩展对象

Microsoft 建议您实现在 XSLT 样式表中使用的 XPath 查询表达式中的自定义的子例程和引用的函数使用扩展对象。

您可以创建.NET 框架 DLL 在实现时,使用扩展对象在.NET 应用程序中执行转换。 自定义子例程和函数实现一个的 DLL 中的并且 DLL 组件的对象实例提供了作为运行时参数执行 转换 XslTransform 对象的方法时使用 XsltArgumentList 对象。

XsltArgumentList AddExtensionObject 方法用于向 XsltArgumentList 对象添加扩展对象实例。 可以使用 获取 删除 方法扩展对象的访问并删除添加到 XsltArgumentList 对象的扩展对象实例。

使用.NET 框架类执行 XSLT 转换的一般准则

  • XPathDocument 类高度优化的 XSLT 和 XPath 的处理。 为获得最佳性能,始终使用 XPathDocument 对象提供源 XML 时所执行 XSLT 转换。
  • 可以缓存和重用 XslTransform 对象用于加载 XSLT 样式表经常用于执行更高版本的转换。
  • XSLT 处理器不会自动缓存的 XSLT 转换中使用的扩展对象实例。 可以缓存和重用 XsltArgumentList 对象用于当您执行更高版本的转换时提供常用的 XSLT 样式表的扩展对象实例。 这是在.NET 框架中的 XSLT 转换中使用的缓存扩展对象的方法。
  • 只应该加载一次和缓存实现嵌入式脚本块的 XSLT 样式表。 您应该重新使用缓存的 XslTransform 对象的更高版本的转换。 使用这种做法可以解决该内存管理问题,必须在样式表中使用内联脚本函数时 Q316775 在 Microsoft 知识库文章中描述。
  • Microsoft 建议您实现在 XSLT 样式表中使用的 XPath 查询表达式所引用的自定义函数使用扩展对象。 仅当实现和引用自定义扩展函数在.NET 应用程序中通过使用 XPathNavigator 和 DOM 类执行的 XPath 查询表达式中,实现自定义 XsltContext IXsltContextFunction IXsltContextVariable 类。
  • 实现的异常处理代码来处理 XsltCompileException ,该 XsltException XmlException .NET 异常类,当您编写代码以执行 XSLT 转换时。 这些异常类提供有关您尝试执行 XSLT 转换时会发生的任何 XSLT 特定于 XML 的问题的信息。 此外,Microsoft 建议您实现处理其他特定.NET 异常的代码实现泛型 System.Exception 类根据其他,XSLT 无关执行 XSLT 转换的代码块中实现的功能。