`
isiqi
  • 浏览: 16561037 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

.Net框架下的XSLT转换技术简介

阅读更多

.Net框架下的XSLT转换技术简介
作者:王凯明 本文选自:赛迪网2003年05月08日

<iframe align="right" marginwidth="0" marginheight="0" src="http://www.cnnet.com.cn/servlets/ad?Pool=tech_pip" frameborder="0" noresize width="360" scrolling="no" height="300"></iframe>一.前言:

  XSLT转换技术是XML中的一项重要技术,本文将向XML开发者介绍.Net框架下的一些不同的XSLT转换技术。同时,本文还将介绍如何运用各种不同的输入数据源以完成一个XSLT转换。在.Net框架下,System.Xml.Xsl.XslTransform类能根据一个XSLT样式表文件转换一个XML文档,它是XSLT转换中最重要的一个类,同时它能够支持W3C的XSLT 1.0的语法,其运用的命名空间是http://www.w3.org/1999/XSL/Transform。

  二.与XSLT转换相关的输入数据源:

  .Net框架下有许多类可以完成读取XML文档以实现XSLT转换的功能,其中最有用的当属System.Xml.XmlReader类了。它是一个虚基类,因此不能被直接运用,必须有一个类继承它。.Net框架下有三个类是从该类继承过来的:XmlTextReader类、XmlNodeReader类以及XmlValidatingReader类,它们都是包含在命名空间System.Xml中的。其中XmlTextReader类能从一个XML文档中读取字符流并检查该文档是否是具有良好结构(well-formed)的,但它并不运用DTD或是XML模式进行XML文档的验证工作。XmlNodeReader类允许数据从任何XML文档对象模型(DOM)的API中被读取,比如一个System.Xml.XmlNode对象,而且XmlNode对象并不必是一个完整的XML文档的根节点,它可以是其一个子节点。XmlValidatingReader类能保证一个XML文档是遵从一个DTD或是XML模式所确定的规则的。下面是一个XmlReader类作为XSLT转换的输入数据源的应用实例。

<ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#ffffff"><pre><ccid_code>  // 将一个XSLT文件的字符串导入到一个TextReader对象中   System.IO.TextReader tr = new System.IO.StreamReader("numbers.xsl");   // 将上面的TextReader对象作为XmlTextReader对象的数据源   System.Xml.XmlReader xr = new System.Xml.XmlTextReader(tr);   // 创建一个新的XslTransform对象   System.Xml.Xsl.XslTransform trans = new System.Xml.Xsl.XslTransform();   // 将XmlReader对象中的样式表导入到上面的XslTransform对象中   trans.Load(xr);</ccid_code></pre></td></tr></tbody></table></ccid_nobr>

  另一种能完成读取XML文档以实现XSLT转换功能的类是System.Xml.XPath.XPathNavigator类或是任何实现了System.Xml.XPath.IXPathNavigable接口的类,这些类包括了System.Xml.XPath.XPathDocument类,System.Xml.XmlDocument类以及System.Xml.XmlDataDocument类。System.Xml.XPath.XPathNavigator类是基于XPath数据模型的,并提供了能够对任何XML数据进行XPath查询的方法。

  System.Xml.XPath.XPathDocument类是这些类中速度最快的一个类,因为它是只读的,在XSLT转换对速度的要求很高时应该使用这个类。System.Xml.XmlDocument类的效率仅次于System.Xml.XPath.XPathDocument类,而System.Xml.XmlDataDocumnet类并不适合XSLT转换,因为它的效率最低。System.Xml.XPath.IXPathNavigable接口可以在任何数据源上实现,同时它允许任何类型的数据作为XSLT转换的数据源。下面的示例代码可以被接在上面的例子后面。

<ccid_code>  // 创建一个新的XPathDocument对象,并从一个XML文件导入数据源 <br><br>  System.Xml.XPath.XPathDocument xp = new <br><br>  System.Xml.XPath.XPathDocument("numbers.xml"); <br><br>  // 创建一个新的XPathNavigator对象 <br><br>  System.Xml.XPath.XPathNavigator xpn = xp.CreateNavigator(); <br><br>  XslTransform类要求XML或XSLT的数据源是一个XmlReader对象或是一个XPathNavigator对象。它的两个最重要的方法是Load()方法和Transform()方法,这两个方法并不提供重载的对Stream对象直接进行处理的方法,但是却可以间接地将Stream对象作为XSLT转换的数据源,而该Stream对象则是从XML文件或XSLT样式表中获取的。下面的代码创建了一个Stream对象,并显示了如何将它作为XSLT转换的数据源,不过该代码段仅仅是一个示例,并没有实际的数据存在。 <br><br>  // 创建一个新的Stream对象 <br><br>  System.IO.Stream st = new System.IO.MemoryStream(); <br><br>  // 在此运用一个XML文件填充上面的Stream对象并将Stream对象的位置置为0 <br><br>  st.Position = 0; <br><br>  // 将Stream对象导入到一个XPathDocument对象中 <br><br>  System.Xml.XPath.XPathDocument xp = new System.Xml.XPath.XPathDocument(st); <br><br>  // 对XSLT文档进行同样的操作 <br><br>  System.IO.Stream XSLTStream = new System.IO.MemoryStream(); <br><br>  // 在此运用一个XSLT文件填充上面的Stream对象并将Stream对象的位置置为0 <br><br>  st.Position = 0; <br><br>  // 创建一个XmlReader对象,并将上面的Stream对象作为数据源 <br><br>  System.Xml.XmlReader xsltXR = new System.Xml.XmlTextReader(XSLTStream); <br><br>  // 以后,该XmlReader对象就可以被传递到XslTransform类的Load()方法中去了 <br><br>  上面的代码中并没有实际的数据存在,我们需要将XML文件或XSLT样式表填充到Stream对象中才能进行实际的操作。另一种设置输入数据源的方法是以字符串的形式从一个URL获取XML文档或XSLT文档,同时还可能有一个可选择的System.Xml.XmlResolver对象,该方法是最直接也是最有效的方法。</ccid_code>

  三.与XSLT转换相关的输出数据源:

<ccid_code>  在介绍了XSLT转换的输入数据源之后,本文接着向大家介绍与之相关的输出数据源。根据所运用的不同类型的输出类,xsl:output元素有时可以被忽略掉。比如在运用XmlWriter类或XmlReader类作为输出类的时候,该元素就被忽略掉了。有关xsl:output元素的详细内容请参考MSDN的文章"Outputs from an XslTransform",这里限于篇幅就不多作介绍了。 <br><br>  综上所述,进行XSLT转换的必要条件包括了一个XML文档,一个XSLT文档以及一个能处理输出的有效对象。下面的代码运用了一个XPathDocument对象以及一个样式表文件进行XSLT转换,其输出的结果被直接显示在控制台中了。 <br><br>  // 创建一个新的XslTransform对象 <br><br>  System.Xml.Xsl.XslTransform xslt = new System.Xml.Xsl.XslTransform(); <br><br>  // 从XSL文件中导入样式表 <br><br>  xslt.Load("numbers.xsl"); <br><br>  // 创建一个新的XPathDocument对象,并导入一个XML文件 <br><br>  System.Xml.XPath.XPathDocument doc = new <br><br>  System.Xml.XPath.XPathDocument("numbers.xml"); <br><br>  // 创建一个新的XmlTextWriter对象用于完成到控制台的数据输出 <br><br>  System.Xml.XmlTextWriter writer = new <br><br>   System.Xml.XmlTextWriter(System.Console.Out); <br><br>  // 进行实际的XSLT转换操作 <br><br>  xslt.Transform(doc, null, writer); <br><br>  // 在完成操作后关闭XmlTextWriter对象 <br><br>  // 同时请注意一旦关闭该对象就不能往控制台中写任何额外信息了 <br><br>  writer.Close();</ccid_code>

  四.与XSLT转换相关的流对象:

<ccid_code>  .Net框架允许程序员将XSLT转换的结果直接输出到一个System.IO.Stream对象,下面的代码将使用一个用于输出的System.IO.MemoryStream对象,然后显示如何运用它进行与XSLT转换的输出相关的操作。 <br><br>  // 创建一个新的XslTransform对象 <br><br>  System.Xml.Xsl.XslTransform xslt = new System.Xml.Xsl.XslTransform(); <br><br>  // 从XSLT文件中导入样式表 <br><br>  xslt.Load("numbers.xsl"); <br><br>  // 导入一个XML文件 <br><br>  System.Xml.XPath.XPathDocument doc = new <br><br>   System.Xml.XPath.XPathDocument("numbers.xml"); <br><br>  // 创建用于输出的Stream对象 <br><br>  System.IO.Stream str = new System.IO.MemoryStream(); <br><br>  // 进行实际的转换操作 <br><br>  xslt.Transform(doc, null, str); <br><br>  // 对Stream对象进行Flush操作,并将其位置置为0 <br><br>  str.Flush(); <br><br>  str.Position = 0; <br><br>  如果一个System.Xml.XmlDocument对象或一个System.Xml.XPath.XPathDocument对象已经被载入到主存中了,那么它们也可以被用作XSLT转换的输入数据源。因为这两个对象都实现了System.Xml.XPath.IXPathNavigable接口,所以都可以作为XslTransform对象的Transform()方法的参数被直接使用。 <br><br>  // 创建一个新的XslTransform对象 <br><br>  System.Xml.Xsl.XslTransform xslt = new System.Xml.Xsl.XslTransform(); <br><br>  // 从XSLT文件中导入样式表 <br><br>  xslt.Load("numbersXML.xsl"); <br><br>  // 将一个XML文档导入到一个XPathDocument对象中 <br><br>  System.Xml.XPath.XPathDocument doc = new <br><br>   System.Xml.XPath.XPathDocument("numbers.xml"); <br><br>  // 创建用于输出的Stream对象 <br><br>  System.IO.Stream str = new System.IO.MemoryStream(); <br><br>  System.Xml.XmlWriter xw = new <br><br>   System.Xml.XmlTextWriter(str,System.Text.Encoding.UTF8); <br><br>  // 进行实际的转换操作 <br><br>  xslt.Transform(doc, null, xw); <br><br>  // 对XmlWriter对象进行Flush操作,并将Stream对象的位置置为0 <br><br>  xw.Flush(); <br><br>  str.Position = 0;</ccid_code>

  五.与XSLT转换相关的嵌入式脚本以及代码:

  .Net框架中的XSLT转换对象提供了对在XSLT文档中用脚本扩展元素来嵌入脚本语言的支持。脚本语言所提供的一组功能比纯XSLT所提供的功能要丰富,经常可以用来对文档内容进行更为复杂的操作,比如对其应用科学计算函数、访问外部信息源等。在.Net框架下,程序员运用msxsl:script元素可以标记XSLT样式表中的嵌入式脚本或代码。脚本扩展元素必须在urn:schemas-microsoft-com:xslt namespace命名空间中声明。.Net框架中的分析器能够支持C#、VB.Net、VBScript或JScript等代码编写的脚本。在脚本元素中,我们通过提供一个implements-prefix属性定义了函数所调用的命名空间,通过提供一个language属性定义了函数所使用的编程语言。同时,我们得注意一个样式表中可以嵌入多种语言的脚本代码,但是同一个命名空间下只能使用同一种语言。下面的实例显示了一个包含嵌入式C#函数的样式表。

<ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt' xmlns:theScript='urn:CustomScript'&gt; &lt;xsl:output omit-xml-declaration='yes' method='text' media-type='text/plain' indent='no' /&gt; &lt;xsl:variable name='displayme' /&gt; &lt;msxsl:script implements-prefix='theScript' language='C#'&gt; &lt;![CDATA[ public string HelloName(string name) { return "Hello " + name; } ]]&gt; &lt;/msxsl:script&gt; &lt;xsl:template match='/'&gt; &lt;xsl:text disable-output-escaping='yes'&gt;Print Integers &gt; 3&lt;/xsl:text&gt; &lt;xsl:apply-templates select='Root/Numbers' /&gt; Script Result: &lt;xsl:value-of select='theScript:HelloName("Joe")' /&gt; Done: &lt;xsl:value-of select='$displayme' /&gt; &lt;/xsl:template&gt; &lt;xsl:template match='Numbers'&gt; Numbers:&lt;xsl:apply-templates select='Integer[@value &gt; 3]' /&gt; &lt;/xsl:template&gt; &lt;xsl:template match='Integer'&gt; Integer: &lt;xsl:value-of select='@value' /&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr>

  六.样式表参数以及扩展对象:

<ccid_code>  XSLT提供了一个在样式表中使用参数以及扩展对象的机制。在.Net框架下,程序员可以通过运用System.Xml.Xsl.XsltArgumentList类实现将参数或扩展对象传递到一个样式表。在样式表中使用参数的机制允许程序员声明一个全局变量,该变量被定义为xsl:variable类型的元素,它是作为一个xsl:stylesheet的子元素而存在的,但它并不包含在xsl:template之中。通过调用XsltArgumentList类的AddParam()方法程序员可以实现添加参数的功能,该方法中的三个参数依次为有效的名称、命名空间的URI以及参数值。如果参数值不是一个字符串、布尔值、数字、节点片断(Node Fragment)或节点集合(Node Set),那么它将被强制转化为双精度浮点值或是字符串。而一个扩展对象是任何一个能返回XSLT数据类型值的.Net类。通过调用XsltArgumentList类的AddExtensionObject()方法程序员可以实现添加扩展对象的功能,该方法中的两个参数分别为有效的名称以及命名空间的URI。下面的代码显示了如何运用XsltArgumentList类在样式表中使用参数以及扩展对象的方法。 <br><br>  // 创建一个新的XPathDocument对象,并导入一个XML文件 <br><br>  System.Xml.XPath.XPathDocument xp = new <br><br>   System.Xml.XPath.XPathDocument("numbers.xml"); <br><br>  // 创建一个新的XslTransform对象 <br><br>  System.Xml.Xsl.XslTransform trans = new System.Xml.Xsl.XslTransform(); <br><br>  // 导入一个XSLT文件到上面的XslTransform对象中 <br><br>  trans.Load("numbersExtension.xsl"); <br><br>  // 创建一个新的XsltArgumentList对象 <br><br>  System.Xml.Xsl.XsltArgumentList xslArg = new <br><br>   System.Xml.Xsl.XsltArgumentList(); <br><br>  // 调用XsltArgumentList对象的AddParam()方法以添加参数 <br><br>  xslArg.AddParam("displayme","","Is this fun?"); <br><br>  // 创建一个新的扩展对象 <br><br>  SayHello hi = new SayHello(); <br><br>  // 调用XsltArgumentList对象的AddExtensionObject()方法以添加扩展对象 <br><br>  xslArg.AddExtensionObject("urn:SayHello",hi); <br><br>  // 创建一个新的System.IO.Stream对象以处理输出结果 <br><br>  System.IO.Stream str = new System.IO.MemoryStream(); <br><br>  // 进行实际的转换操作 <br><br>  trans.Transform(xp, xslArg, str); <br><br>  // 对Stream对象进行Flush操作,并将其位置置为0 <br><br>  str.Flush(); <br><br>  str.Position = 0; <br><br>  // 创建一个新的StreamReader对象以读取流并返回字符串 <br><br>  System.IO.StreamReader sr = new System.IO.StreamReader(str); <br><br>  string xmlOut = sr.ReadToEnd(); <br><br>  // 关闭StreamReader 对象 <br><br>  sr.Close(); <br><br>  // 将结果写到控制台中 <br><br>  Console.Write(xmlOut); <br><br>  // 扩展对象返回Hello Name <br><br>  public class SayHello   <br><br>  { <br><br>   public string HelloName(string name) { <br><br>   return "Hello " + name; <br><br>  } <br><br>  }</ccid_code>

  通过上面的介绍,我们发现使用扩展对象和使用嵌入式脚本具有许多相同之处。下面我们分析一下使用扩展对象相对于使用嵌入式脚本的一些优缺点。

  移植性:嵌入式脚本比扩展对象更容易移植,因为任何.Net平台都可以正确地用嵌入式脚本来转换一个样式表。而另一方面,使用扩展对象的样式表则只能用一段代码来进行转换,而且需在.Net平台或其他一些支持扩展对象的平台下进行,并要求这段代码能正确地实现一个带有效的名称和命名空间URI的扩展对象。

  大小:一个依赖于扩展对象的样式表比包含嵌入式脚本的样式表要小,而且更容易维护。

  灵活性:正如我们看到的那样,依赖于扩展对象的样式表可以按照修改约束它们的扩展对象的功能来修改它们的行为。而使用嵌入式脚本的样式表则永远只能按照嵌入的脚本语言指定的功能执行操作。

  性能:因为扩展对象是预编译的,而不是即时编译的,因此使用扩展对象的脚本的性能在某种程度上要比嵌入式脚本高一些。不过具体情况下还要考虑装入样式表的频率以及嵌入式脚本的规模等因素。

  可维护性:使用扩展对象的样式表在修改和纠错时可能比较困难,因为真正的代码从样式表和提供扩展对象实现的代码中分离出去了。而嵌入式脚本尽管稍微慢一些,却具有将所有代码都置于本地的优点。

  通过考虑上述一些因素,我们可以决定在具体的情况下是使用扩展对象还是使用嵌入式脚本了。

  七.总结:

  本文向大家介绍了.Net框架下和XSLT转换相关的一些知识,XSLT转换技术是XML中的一项重要技术。.Net框架对XSLT转换提供了稳健的支持,它不仅完全支持W3C定义的XSLT规范,还有许多有用的扩展,比如在样式表中嵌入多种语言的脚本、使用扩展对象来扩展XSLT的功能等等,从而增强了.Net应用程序中样式表的易用性。最后,我希望大家能通过本文掌握.Net框架有关XSLT转换的一些基本技术,并了解每种技术的优缺点以更好地应用于实际的项目。
分享到:
评论

相关推荐

    asp.net 介绍的有各种控件的使用

    asp.net的控件、对象、文件操作、 framWork、xml、xsl、XML驱动开发、css、 1.Net框架下的XSLT转换技术简介 2 图象多媒体 3 其他新技术 个人感觉这个不错,值得一看

    ASP.NET深入编程技术

    - **XSLT**: 解释了XSLT的工作原理和使用场景,如何使用XSLT进行XML文档的转换。 - **XPath**: 介绍了XPath的选择语法及其在XML文档查询中的应用。 - **DOM接口与SAX接口**: 讲述了如何在.NET中使用DOM和SAX接口来...

    VB 2005 和 the .NET 2.0 高级平台(第2版)

    6. **XML编程**:讨论XML文档处理,XPath查询,XSLT转换,以及LINQ to XML的使用。 7. **并发和多线程**:如何在VB 2005中实现多线程程序,管理线程同步和异步操作。 8. **错误处理和异常处理**:理解VB 2005中的...

    第11章 ASP.NET AJAX开发技术

    11.1.1 AJAX技术简介 - AJAX技术由多个组件构成,包括JavaScript(用于处理异步请求)、CSS(用于样式控制)、HTML(构建页面结构)、XML(数据交换格式)、XSLT(转换XML数据)、DOM(文档对象模型,用于操作HTML或...

    ASP.NET完全入门

    ASP.NET并非ASP的简单升级,它是.NET框架下的新一代Web开发技术。相比ASP,ASP.NET采用了全新的架构,借鉴了Java和VB的优势,引入了众多新特性,如事件驱动的页面模型、服务器控件、代码隐藏技术等,显著提高了开发...

    NET程序设计全接触

    .NET框架是由微软公司开发的一个全新软件开发平台,它提供了强大的工具集和技术栈来帮助开发者构建高效的应用程序。.NET框架不仅支持多种编程语言,如C#、VB.NET等,还引入了一系列创新性的特性,比如通用语言运行时...

    解析dotnet xml

    因此,掌握.NET框架下的XML技术对于开发人员来说至关重要。 #### 二、XML命名空间和相关类简介 .NET框架提供了一系列与XML相关的命名空间,以便于开发人员能够高效地处理XML文档。这些命名空间主要包括: - **...

    C# Primer - A Practical Approach

    本书详细介绍了如何使用.NET框架提供的工具和技术来进行XML编程,包括使用Firehose和DOM解析器模型,以及XSLT、XPath和模式等技术。 ##### XML编程:使用Firehose和DOM解析器模型、XSLT、XPath和模式 - **Firehose...

    C#.NET开发者手册英文版

    - XPath/XSLT:提供了强大的查询和转换 XML 的能力。 - XML 序列化:将对象转换为 XML 格式。 #### 10. ASP.NET - **Web 应用开发框架**:ASP.NET 为构建动态 Web 应用提供了框架支持。 - **特性**: - 页面...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    此外,《ASP.NET 4高级程序设计(第4版)》专门提供了两章的内容来教你如何用Ajax 技术制作快速响应的页面,以及如何使用微软的ASP.NETAJAX平台。另外,还专门介绍了ASP.NET4 新增的功能,如MVC 和动态数据等。  ...

    Sandcastle(.net程序集CHM帮助文件生成器)

    在.NET框架中,Sandcastle工具正是用于生成高质量、详尽的程序集文档,尤其是CHM(Compiled Help Manual)帮助文件,这种格式通常用于离线查看,方便开发者随时查阅。本文将深入探讨Sandcastle的工作原理、使用方法...

    ASP XML编程深入.pdf

    - **XSLT与XPath**: XSLT(Extensible Stylesheet Language Transformations)是一种用于转换XML文档的语言,XPath则是一种在XML文档中查找信息的语言。 - **.NET中的DOM接口和模拟SAX接口**: 这些章节进一步解释了...

    xml和asp.net超詳細講義

    ASP.NET是一个用于开发Web应用程序的框架,支持创建静态和动态网页。动态网页可以根据用户的请求动态生成内容。 **4.2 ASP.NET的开发环境** 开发ASP.NET应用通常需要安装Microsoft Visual Studio等IDE,同时还需要...

    ASP.NET4高级程序设计(第4版) 3/3

    此外,《ASP.NET 4高级程序设计(第4版)》专门提供了两章的内容来教你如何用Ajax 技术制作快速响应的页面,以及如何使用微软的ASP.NETAJAX平台。另外,还专门介绍了ASP.NET4 新增的功能,如MVC 和动态数据等。  ...

    XML官方向导

    4. XSLT:XML样式表转换语言,用于转换XML文档的格式或结构,实现数据呈现的灵活性。 5. DOM(Document Object Model):XML文档对象模型,将XML文档表示为树形结构,方便程序对其进行操作。 6. SAX(Simple API for...

    AJAX框架汇总Purejavascript: Application Frameworks

    - **简介**:BackBase是一款功能强大的框架,为.NET和JAVA平台提供了丰富的功能集。 - **特性**: - 支持多种平台; - 高度可定制化; - 强大的API支持。 - **应用场景**:适合企业级应用开发,特别是那些需要跨...

    Wrox.Professional.Visual.Basic.2010.and.NET.4

    - XPath 查询与 XSLT 转换 - XML 文档的创建与编辑 **章节10:ADO.NET 与 LINQ** - **知识点**: - ADO.NET 概览 - 数据连接与命令执行 - 数据适配器与数据集 - LINQ to SQL - Entity Framework 概述 **...

    可扩展标记语言(XML)

    ### 可扩展标记语言(XML)知识点详解 #### 1. XML简介与背景 - **定义**: XML...通过以上内容的学习,读者可以更好地理解和应用XML技术,在实际开发中充分利用XML的强大功能,特别是在.NET框架中的应用场景。

Global site tag (gtag.js) - Google Analytics