如何: 管线在.net 应用程序中的 XSLT 转换

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 320847
本文已归档。它按“原样”提供,并且不再更新。
概要
本文演示如何在.net 应用程序中的 XSL 转换 (XSLT) 转换的管道。该术语的 XSLT 转换上下文中的"管道"传送,是由两个或多个 XSLT 样式表生成最终的所需的输出的序列源可扩展标记语言 (XML) 文档中的数据以增量方式转换的过程。在过程由转换管道中的每个中间阶段生成的输出,将使用作为以下阶段所有通过该方法最终转换阶段的输入生成所需的输出。

.NET 框架类 System.Xml.XslSystem.Xml.XPathSystem.IO 命名空间中的可用于以编程方式在.net 应用程序中的 XSLT 转换的管道。本文的以下各节提供了帮助您实施和检查的管道传送在 ASP.NET 应用程序中的 XSLT 转换过程的说明。此外可以应用和其他类型的管道的 XSLT 转换的.net 应用程序中使用图示的概念。

back to the top

创建和设置示例 ASP.NET 应用程序

  1. 若要创建新的 Microsoft Visual Basic.net ASP.NET Web 应用程序项目使用 Visual Studio.net 命名"XSLTPipelineDemo"(不带引号)。
  2. 使用下面的代码创建并添加到项目中称为 Employees.xml (不带引号) 的 XML 文档:
    <?xml version='1.0'?><employees>  <employee>    <employeeId>1</employeeId>    <name>      <given>Nancy</given>      <family>Davolio</family>    </name>  </employee>  <employee>    <employeeId>2</employeeId>    <name>      <given>Andrew</given>      <family>Fuller</family>    </name>  </employee>  <employee>    <employeeId>3</employeeId>    <name>      <given>Janet</given>      <family>Leverling</family>    </name>  </employee>  </employees>					
  3. 使用下面的代码创建并添加名为"sortEmployees.xslt"(不带引号) 到项目的 XSLT 样式表。此样式表包含 XSLT 代码 Employees.xml XML 文档中的数据进行排序 (按降序顺序,在系列名称 [员工、 名称,和系列] 上元素)。当您应用此样式表时生成的输出是源 XML 数据的排序的版本:
    <?xml version='1.0'?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"><xsl:param name="sortColumn" select="'family'"/><xsl:param name="sortOrder" select="'descending'"/><xsl:template match="employees">   <employees>   <xsl:apply-templates select="employee/name">         <xsl:sort select="./*[local-name() = $sortColumn]" order="{$sortOrder}"/>               </xsl:apply-templates>     </employees></xsl:template> <xsl:template match="employee/name">  <employee>	  <xsl:copy-of select="parent::node()/*"/>  </employee>  </xsl:template> </xsl:stylesheet>					
  4. 使用下面的代码创建并添加到项目中称为 EmployeesHTMLTable.xslt (不带引号) 的 XSLT 样式表。此样式表包含源 Employees.xml XML 文档中或在已排序 sortEmployees.xsl XSLT 样式表应用于 Employees.xml XML 文档时生成的 XML 包含) 的雇员 XML 数据转换的 XSLT 代码超文本标记语言 (HTML) 的表:
    <?xml version='1.0'?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"><xsl:template match="employees">	<HTML>	<BODY>	<TABLE BORDER="1">	<TR>	  <TH>Employee ID</TH>	  <TH>Employee Name</TH>	</TR>	<xsl:for-each select="employee">		<TR>  		  <TD>		     <xsl:value-of select="employeeId"/>		  </TD>		  <TD>		     <xsl:value-of select="name/family"/>, <xsl:value-of select="name/given"/>		  </TD>		</TR>	</xsl:for-each>	</TABLE>	</BODY>	</HTML>   </xsl:template> </xsl:stylesheet>					
  5. 您可以将这两个独立于另一个在 XSLT 样式表应用于 Employees.xml 文件中。应用 sortEmployees.xsl 对 Employees.xml 文件中的数据进行排序,而应用 employeesHTMLTable.xsl 生成的 HTML 表表示形式的源 XML。若要获取按递减顺序排序的系列名称数据的一个 HTML 表表示,管道这些两个 XSLT 转换 (第一次将 sortEmployees.xsl 应用于 Employees.xml 文件,然后将 employeesHTMLTable.xsl 应用于第一个转换所生成的输出)。
  6. 复制并粘贴以下代码在 Page_Load 事件过程中的实现前面描述的管道传送的 WebForm1.aspx
    'Load the source XML document (Employees.xml) into an XPathDocument object.Dim xmlDoc As New System.Xml.XPath.XPathDocument(Server.MapPath("employees.xml"))'Load the first stylesheet (sortEmployees.xslt) that sorts the data in employees.xml'into an XslTransform object.Dim xslt As New System.Xml.Xsl.XslTransform()xslt.Load(Server.MapPath("sortEmployees.xslt"))'Execute the first transformation and write the interim output (the sorted XML)'to a MemoryStream object. Using an in memory stream (as opposed to a FileStream object) 'to store the interim output generated by the first transformation is a better option from  'a performance standpoint as it avoids unnecessary disk I/O.Dim memStream As New System.IO.MemoryStream()xslt.Transform(xmlDoc, Nothing, memStream)'Reset the MemoryStream internal pointer to point to the 'beginning of the stream. This is required for the following line of 'code to be able to read the data from the memory stream.memStream.Position = 0'Load the interim sorted XML output in an XPathDocument object. 'Notice that a second XPathDocument object is created to do this. 'The reason for this is that the XPathDocument class does not implement a Load 'method (like the System.Xml.XmlDocument class) that can be used to re-load new XML data into an existing 'object instance. While a single XmlDocument object could have been used to execute the two pipelined 'transformations in this sample, it has not been chosen because the XPathDocument is highly optimized for XPath query 'execution and XSLT transformations. It is the recommended interface to use when programatically executing 'XSLT transformations in .NET applications.Dim interimDoc As New System.Xml.XPath.XPathDocument(memStream)'Load the second stylesheet(employeesHTMLTable.xslt)that transforms the sorted data to an HTML table'into the XslTransform object.xslt.Load(Server.MapPath("employeesHTMLTable.xslt"))'Execute the second transformation and stream the output directly to the 'ASP.Net Response object's OutputStream to display the results in the client browser.xslt.Transform(interimDoc, Nothing, Response.OutputStream)					
  7. 保存并生成解决方案。
back to the top

测试示例 ASP.NET 应用程序

  1. 执行 XSLTPiplelineDemo ASP.NET 应用程序启动并在浏览器中显示 WebForm1.aspx
  2. Page_Load 事件过程中的 WebForm1.aspx 代码运行 XSLT 转换并生成输出 (以降序顺序对系列名称) 显示一个已排序的 HTML 表的窗体中员工的列表。
  3. 关闭浏览器窗口退出 ASP.NET 应用程序。
back to the top

警告:本文已自动翻译

属性

文章 ID:320847 - 上次审阅时间:01/17/2015 05:30:21 - 修订版本: 3.2

Microsoft .NET Framework 1.0, Microsoft .NET Framework 1.1

  • kbnosurvey kbarchive kbmt kbbcl kbhowtomaster KB320847 KbMtzh
反馈