小妖女 发表于 2015-1-16 22:41:37

ASP.NET网站制作之ASP.NET 2.0中XSLT的利用

java的设计机制:首先产生一个中间码,第二部编译为本地(机器)码。这个机制有很大的缺点。asp.net  在asp.net2.0中,对XML的使用年夜为加强,而在XSLT处置方面,也供应了新的功效。本文将复杂对asp.net2.0中XSLT的利用作复杂的申明,固然本文假定读者有必定的XSLT的基本常识。

  在asp.net2.0中,XSLT方面有以下的变化和新功效:

  ・XslCompiledTransform-实践上是.NET1.0的XslTransform,但供应了更好的功能撑持,也撑持之前.net1.0下的使用的顺遂迁徙.

  ・XsltArgumentList-同意向XSLT中传送参数大概工具

  XsltCompileException-当经由过程loa()办法加载XSL文档时产生毛病时发生的非常。

  XsltException-当在对XSL文档举行剖析时产生毛病时发生的非常。

  先来看个复杂的例子,该例子从NORTHWIND数据库中拿出数据,以XML格局展现,再以XSLT格局转换,个中XSLT代码以下:

<?xmlversion="1.0"?>
<xsl:stylesheetversion="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:outputmethod="html"/>
<xsl:templatematch="/">
<HTML>
<HEAD>
 <TITLE>SimpleXSLTTransformation</TITLE>
</HEAD>
<BODY>
 <H2>SimpleXSLTTransformation</H2>
 <tableborder="1"cellSpacing="1"cellPadding="1">
  <center>
  <xsl:for-eachselect="//Categories">
  <!--Eachrecordonaseperaterow-->
  <xsl:elementname="tr">
   <xsl:elementname="td">
    <xsl:value-ofselect="ProductSubcategoryID"/>
   </xsl:element>
  <xsl:elementname="td">
 <xsl:value-ofselect="Name"/>
 </xsl:element>
 <xsl:elementname="td">
 <xsl:attributename="align">center</xsl:attribute>
 <xsl:value-ofselect="ModifiedDate"/>
 </xsl:element>
 </xsl:element>
 </xsl:for-each>
 </center>
 </table>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
  然后其展现的ASPX代码为:

<%@PageLanguage="C#"%>
<%@ImportNamespace="System.Data.SqlClient"%>
<%@ImportNamespace="System.Xml"%>
<%@ImportNamespace="System.Xml.Xsl"%>
<%@ImportNamespace="System.Xml.XPath"%>
<%@ImportNamespace="System.Web.Configuration"%>
<scriptrunat="server">
voidPage_Load(objectsender,System.EventArgse)
{
 stringconnString=WebConfigurationManager.ConnectionStrings
["adventureWorks"].ConnectionString;
 using(SqlConnectionconnection=newSqlConnection(connString))
 {
  connection.Open();
  SqlCommandcommand=newSqlCommand
("Select*fromProduction.ProductSubcategoryasCategories"+
"forxmlauto,elements",connection);
  XmlReaderreader=command.ExecuteXmlReader();
  XPathDocumentxpathDoc=newXPathDocument(reader);
  stringxslPath=Server.MapPath("Category.xsl");
  XslCompiledTransformtransform=newXslCompiledTransform();
  transform.Load(xslPath);
  transform.Transform(xpathDoc,null,Response.Output);
 }
}
</script>
  个中注重我们先用xmlreader读取数据库提出来的数据(以xmlauto的体例),然后载进xsl文件,再用xslcompiledtransform类举行转换,个中用xpathdocument是为了功能的提拔。注重这里用xslcompiledtransform代替了.net1.1中的xslttransform,运转了局以下图


  还能够向XSLT中传进参数或工具,先看怎样向其传进参数,好比要改动上例的背景色彩,则能够如许写XSLT

<?xmlversion="1.0"?>
<xsl:stylesheetversion="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:outputmethod="html"/>
<xsl:paramname="BackGroundColor"select="Blue"/>
<xsl:templatematch="/">
<HTML>
<HEAD>
<TITLE>PassingParameterstoanXSLTStyleSheet</TITLE>
</HEAD>
<BODY>
<H2>PassingParameterstoanXSLTStyleSheet</H2>
<tableborder="1"cellSpacing="1"cellPadding="1">
<center>
<xsl:for-eachselect="//Categories">
<!--Eachrecordonaseperaterow-->
<xsl:elementname="tr">
<xsl:attributename="bgcolor">
<xsl:value-ofselect="$BackGroundColor"/>
</xsl:attribute>
<xsl:elementname="td">
<xsl:value-ofselect="ProductSubcategoryID"/>
</xsl:element>
<xsl:elementname="td">
<xsl:value-ofselect="Name"/>
</xsl:element>
<xsl:elementname="td">
<xsl:attributename="align">center</xsl:attribute>
<xsl:value-ofselect="ModifiedDate"/>
</xsl:element>
</xsl:element>
</xsl:for-each>
</center>
</table>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
  要注重的是个中的是:

<xsl:attributename="bgcolor">
<xsl:value-ofselect="$BackGroundColor"/>
  以如许的情势指定了backgroundcolor是一个参数,而在XSLT的一入手下手,以<xsl:paramname="BackGroundColor"select="Blue"/>的体例,为backgroundcolor设定了一个值为蓝色,如许则为使<tr>的背景色彩bgcolor=blue,完成将输入数据的每行变成蓝色的效果。
<P>  固然,在下面的例子中,我们是已硬编码的体例设置xslt的参数,一样平常来讲,应当在asp.net页面中举行设置。而在asp.net2.0中,可使用XsltArgumentList类来向XSLT中传送参数,详细利用办法以下:

<%@PageLanguage="C#"%>
<%@ImportNamespace="System.Data.SqlClient"%>
<%@ImportNamespace="System.Xml"%>
<%@ImportNamespace="System.Xml.Xsl"%>
<%@ImportNamespace="System.Xml.XPath"%>
<%@ImportNamespace="System.Web.Configuration"%>

<scriptrunat="server">
voidPage_Load(objectsender,System.EventArgse)
{
 stringconnString=WebConfigurationManager.ConnectionStrings
["adventureWorks"].ConnectionString;
 using(SqlConnectionconnection=newSqlConnection(connString))
 {
  connection.Open();
  SqlCommandcommand=newSqlCommand
("Select*fromProduction.ProductSubCategoryasCategories"+
"forxmlauto,elements",connection);
  XmlReaderreader=command.ExecuteXmlReader();
  XPathDocumentxpathDoc=newXPathDocument(reader);
  stringxslPath=Server.MapPath("App_Data/Category.xsl");
  XslCompiledTransformtransform=newXslCompiledTransform();
  transform.Load(xslPath);
  XsltArgumentListargsList=newXsltArgumentList();
  stringbackGroundColor="Tan";
  //AddtherequiredparameterstotheXsltArgumentListobject
  argsList.AddParam("BackGroundColor","",backGroundColor);
  transform.Transform(xpathDoc,argsList,Response.Output);
 }
}
  个中,注重黑体加粗部分,先实例化了XsltArgumentList类,接着设置了backGroundColor色彩,再利用XsltArgumentList类的addParam办法,向XSLT华夏先设置好的BackGroundColor传送参数。最初,在XslCompiledTransform的transform办法中,个中的第二个参数,传进方才实例化后的argsList,如许就能够完成在aspx页面中静态向XSLT中传送进参数了,完成的效果以下图所示


  除此以外,在.net2.0中,还能够在xslt中间接挪用内部的类中的办法。而被XSLT挪用的内部类,我们称为扩大工具。上面举例申明,起首先创建一个类DateTimeConverter,这个类中,我们有一个办法能够将指定的日期举行格局化,以下所示:

usingSystem;
publicclassDateTimeConverter
{
 publicDateTimeConverter()
 {}
 publicstringToDateTimeFormat(stringdata,stringformat)
 {
  DateTimedate=DateTime.Parse(data);
  returndate.ToString(format);
 }
}
  将这个类放在App_Code这个文件夹下,以便利挪用。为了在XSLT中挪用这个类,起首在XSLT文件的开首用XMLNS的体例指定要挪用的扩大工具,以下代码所示:

<?xmlversion="1.0"?>
<xsl:stylesheetversion="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:DateTimeConverter="urn:DateTimeConverter">
<xsl:outputmethod="html"/>
<xsl:paramname="BackGroundColor"select="Blue"/>
<xsl:templatematch="/">
<HTML>
<HEAD>
<TITLE>InvokingextensionobjectsfromanXSLTStyleSheet</TITLE>
</HEAD>
<BODY>
<H2>InvokingextensionobjectsfromanXSLTStyleSheet</H2>
<tableborder="1"cellSpacing="1"cellPadding="1">
<center>
<xsl:for-eachselect="//Categories">
<!--Eachrecordonaseperaterow-->
<xsl:elementname="tr">
<xsl:attributename="bgcolor">
<xsl:value-ofselect="$BackGroundColor"/>
</xsl:attribute>
<xsl:elementname="td">
<xsl:value-ofselect="ProductSubcategoryID"/>
</xsl:element>
<xsl:elementname="td">
<xsl:value-ofselect="Name"/>
</xsl:element>
<xsl:elementname="td">
<xsl:attributename="align">center</xsl:attribute>
<xsl:value-ofselect="DateTimeConverter:ToDateTimeFormat
(ModifiedDate,F)"/>
</xsl:element>
</xsl:element>
</xsl:for-each>
</center>
</table>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
  在下面的代码中,我们用<xmlns:DateTimeConverter="urn:DateTimeConverter">的体例,给要被挪用的扩大工具定名为DateTimeConverter,以便利上面的挪用。而为了将日期格局化,经由过程<xsl:value-ofselect="DateTimeConverter:ToDateTimeFormat(ModifiedDate,F)"/>的体例,挪用了内部类DateTimeConverter中的ToDateTimeFormat的办法,注重这里是以类名:办法名(参数表)的情势暗示。

  接上去,在aspx页面中,挪用该XSLT的代码以下

<%@PageLanguage="C#"%>
<%@ImportNamespace="System.Data.SqlClient"%>
<%@ImportNamespace="System.Xml"%>
<%@ImportNamespace="System.Xml.Xsl"%>
<%@ImportNamespace="System.Xml.XPath"%>
<%@ImportNamespace="System.Web.Configuration"%>

<scriptrunat="server">
voidPage_Load(objectsender,System.EventArgse)
{
 stringconnString=WebConfigurationManager.ConnectionStrings
["adventureWorks"].ConnectionString;
 using(SqlConnectionconnection=newSqlConnection(connString))
 {
  connection.Open();
  SqlCommandcommand=newSqlCommand("Select*fromProduction.ProductSubCategoryasCategories"+
"forxmlauto,elements",connection);
  XmlReaderreader=command.ExecuteXmlReader();
  XPathDocumentxpathDoc=newXPathDocument(reader);
  stringxslPath=Server.MapPath("App_Data/Category.xsl");
  XslCompiledTransformtransform=newXslCompiledTransform();
  transform.Load(xslPath);
  XsltArgumentListargsList=newXsltArgumentList();
  stringbackGroundColor="Tan";

  argsList.AddParam("BackGroundColor","",backGroundColor);

  DateTimeConverterconverter=newDateTimeConverter();
  argsList.AddExtensionObject("urn:DateTimeConverter",converter);
  transform.Transform(xpathDoc,argsList,Response.Output);
 }
}
</script>
  在下面的代码中,要寄望的是,起首实例化了DateTimeConverter类,然后经由过程XsltArgumentList的AddExtensionObject办法,增添其扩大工具,个中用"urn:DateTimeConverter"的体例,指了然其扩大工具的别号。运转的效果以下图

我觉得很重要,一般所说的不重要应该指的是:你学好一种以后再学另一种就很容易了。(因为这样大家可能有一个错觉就是语言不是很重要,只要随便学一种就可以了,其实不是这样的。

山那边是海 发表于 2015-1-19 21:17:20

以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。

灵魂腐蚀 发表于 2015-1-25 23:13:38

如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。

小妖女 发表于 2015-2-9 22:29:33

大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。

兰色精灵 发表于 2015-2-28 02:10:44

主流网站开发语言之JSP:JSP和Servlet要放在一起讲,是因为它们都是Sun公司的J2EE(Java2platformEnterpriseEdition)应用体系中的一部分。

不帅 发表于 2015-3-9 18:23:17

我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。

飘灵儿 发表于 2015-3-17 00:12:16

是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。

飘飘悠悠 发表于 2015-3-23 09:26:58

微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。
页: [1]
查看完整版本: ASP.NET网站制作之ASP.NET 2.0中XSLT的利用