在 中对XML的应用大为增强而在XSLT处理方面也提供了新的功能本文将简单对 中XSLT的使用作简单的说明当然本文假定读者有一定的XSLT的基础知识
在 中XSLT方面有如下的转变和新功能
XslCompiledTransform 实际上是NET 的 XslTransform 但提供了更好的性能支持也支持之前net 下的应用的顺利迁移
XsltArgumentList 允许向XSLT中传递参数或者对象
XsltCompileException 当通过loa()方法加载XSL文档时发生错误时产生的异常
XsltException 当在对XSL文档进行解析时发生错误时产生的异常
先来看个简单的例子该例子从NORTHWIND数据库中拿出数据以XML格式展示再以XSLT格式转换其中XSLT代码如下
<?xml version= ?>
<xsl:stylesheet version= xmlns:xsl=>
<xsl:output method=html />
<xsl:template match=/>
<HTML>
<HEAD>
<TITLE>Simple XSLT Transformation</TITLE>
</HEAD>
<BODY>
<H>Simple XSLT Transformation</H>
<table border= cellSpacing= cellPadding=>
<center>
<xsl:foreach select=//Categories>
<! Each record on a seperate row >
<xsl:element name=tr>
<xsl:element name=td>
<xsl:valueof select=ProductSubcategoryID />
</xsl:element>
<xsl:element name=td>
<xsl:valueof select=Name />
</xsl:element>
<xsl:element name=td>
<xsl:attribute name=align>center</xsl:attribute>
<xsl:valueof select=ModifiedDate />
</xsl:element>
</xsl:element>
</xsl:foreach>
</center>
</table>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
然后其展示的ASPX代码为
<%@ Page Language=C# %>
<%@ Import Namespace=SystemDataSqlClient %>
<%@ Import Namespace=SystemXml %>
<%@ Import Namespace=SystemXmlXsl %>
<%@ Import Namespace=SystemXmlXPath %>
<%@ Import Namespace=SystemWebConfiguration %>
<script runat=server>
void Page_Load(object sender SystemEventArgs e)
{
string connString = WebConfigurationManagerConnectionStrings
[adventureWorks]ConnectionString;
using (SqlConnection connection = new SqlConnection(connString))
{
connectionOpen();
SqlCommand command = new SqlCommand
(Select * from ProductionProductSubcategory as Categories +
for xml autoelements connection);
XmlReader reader = commandExecuteXmlReader();
XPathDocument xpathDoc = new XPathDocument(reader);
string xslPath = ServerMapPath(Categoryxsl);
XslCompiledTransform transform = new XslCompiledTransform();
transformLoad(xslPath);
transformTransform(xpathDoc null ResponseOutput);
}
}
</script>
其中注意我们先用xmlreader读取数据库提出来的数据(以xml auto的方式)然后载入xsl文件再用xslcompiledtransform类进行转换其中用xpathdocument是为了性能的提升注意这里用xslcompiledtransform取代了net 中的xslttransform还可以向XSLT中传入参数或对象先看如何向其传入参数比如要改变上例的背景颜色则可以这样写XSLT
<?xml version= ?>
<xsl:stylesheet version= xmlns:xsl=>
<xsl:output method=html />
<xsl:param name=BackGroundColor select=Blue />
<xsl:template match=/>
<HTML>
<HEAD>
<TITLE>Passing Parameters to an XSLT Style Sheet</TITLE>
</HEAD>
<BODY>
<H> Passing Parameters to an XSLT Style Sheet</H>
<table border= cellSpacing= cellPadding=>
<center>
<xsl:foreach select=//Categories>
<! Each record on a seperate row >
<xsl:element name=tr>
<xsl:attribute name=bgcolor>
<xsl:valueof select=$BackGroundColor />
</xsl:attribute>
<xsl:element name=td>
<xsl:valueof select=ProductSubcategoryID />
</xsl:element>
<xsl:element name=td>
<xsl:valueof select=Name />
</xsl:element>
<xsl:element name=td>
<xsl:attribute name=align>center</xsl:attribute>
<xsl:valueof select=ModifiedDate />
</xsl:element>
</xsl:element>
</xsl:foreach>
</center>
</table>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
要注意的是其中的是
<xsl:attribute name=bgcolor>
<xsl:valueof select=$BackGroundColor />
以这样的形式指定了backgroundcolor是一个参数而在XSLT的一开始以<xslparam name=BackGroundColor select=Blue />的方式为backgroundcolor设定了一个值为蓝色这样则为使<tr>的背景颜色bgcolor=blue实现将输出数据的每一行变为蓝色的效果
当然在上面的例子中我们是已硬编码的方式设置xslt的参数一般来说应该在 页面中进行设置而在 中可以使用XsltArgumentList类来向XSLT中传递参数具体使用方法如下
<%@ Page Language=C# %>
<%@ Import Namespace=SystemDataSqlClient %>
<%@ Import Namespace=SystemXml %>
<%@ Import Namespace=SystemXmlXsl %>
<%@ Import Namespace=SystemXmlXPath %>
<%@ Import Namespace=SystemWebConfiguration %>
<script runat=server>
void Page_Load(object sender SystemEventArgs e)
{
string connString = WebConfigurationManagerConnectionStrings
[adventureWorks]ConnectionString;
using (SqlConnection connection = new SqlConnection(connString))
{
connectionOpen();
SqlCommand command = new SqlCommand
(Select * from ProductionProductSubCategory as Categories +
for xml autoelements connection);
XmlReader reader = commandExecuteXmlReader();
XPathDocument xpathDoc = new XPathDocument(reader);
string xslPath = ServerMapPath(App_Data/Categoryxsl);
XslCompiledTransform transform = new XslCompiledTransform();
transformLoad(xslPath);
XsltArgumentList argsList = new XsltArgumentList();
string backGroundColor = Tan;
//Add the required parameters to the XsltArgumentList object
argsListAddParam(BackGroundColor backGroundColor);
transformTransform(xpathDoc argsList ResponseOutput);
}
} 其中注意黑体加粗部分先实例化了XsltArgumentList类接着设置了backGroundColor颜色再使用 XsltArgumentList类的addParam方法向XSLT中原先设置好的BackGroundColor传递参数最后在 XslCompiledTransform的transform方法中其中的第二个参数传入刚才实例化后的argsList这样就可以实现在 aspx页面中动态向XSLT中传递进参数了
除此之外在net 中还可以在xslt中直接调用外部的类中的方法而被XSLT调用的外部类我们称为扩展对象下面举例说明首先先建立一个类DateTimeConverter这个类中我们有一个方法可以将指定的日期进行格式化如下所示
using System;
public class DateTimeConverter
{
public DateTimeConverter()
{}
public string ToDateTimeFormat(string data string format)
{
DateTime date = DateTimeParse(data);
return dateToString(format);
}
}
将这个类放在App_Code这个文件夹下以方便调用为了在XSLT中调用这个类首先在XSLT文件的开头用XMLNS的方式指定要调用的扩展对象如下代码所示
<?xml version= ?>
<xsl:stylesheet version=
xmlns:xsl=
xmlns:DateTimeConverter=urn:DateTimeConverter>
<xsl:output method=html />
<xsl:param name=BackGroundColor select=Blue />
<xsl:template match=/>
<HTML>
<HEAD>
<TITLE>Invoking extension objects from an XSLT Style Sheet</TITLE>
</HEAD>
<BODY>
<H>Invoking extension objects from an XSLT Style Sheet</H>
<table border= cellSpacing= cellPadding=>
<center>
<xsl:foreach select=//Categories>
<! Each record on a seperate row >
<xsl:element name=tr>
<xsl:attribute name=bgcolor>
<xsl:valueof select=$BackGroundColor />
</xsl:attribute>
<xsl:element name=td>
<xsl:valueof select=ProductSubcategoryID />
</xsl:element>
<xsl:element name=td>
<xsl:valueof select=Name />
</xsl:element>
<xsl:element name=td>
<xsl:attribute name=align>center</xsl:attribute>
<xsl:valueof select=DateTimeConverter:ToDateTimeFormat
(ModifiedDate F) />
</xsl:element>
</xsl:element>
</xsl:foreach>
</center>
</table>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
在上面的代码中我们用<xmlnsDateTimeConverter=urnDateTimeConverter>的方式给要被调用的扩展对象命名为DateTimeConverter以方便下面的调用而为了将日期格式化通过<xslvalueof select=DateTimeConverterToDateTimeFormat (ModifiedDate F) />的方式调用了外部类DateTimeConverter中的ToDateTimeFormat的方法注意这里是以类名方法名(参数表)的形式表示
接下来在aspx页面中调用该XSLT的代码如下
<%@ Page Language=C# %>
<%@ Import Namespace=SystemDataSqlClient %>
<%@ Import Namespace=SystemXml %>
<%@ Import Namespace=SystemXmlXsl %>
<%@ Import Namespace=SystemXmlXPath %>
<%@ Import Namespace=SystemWebConfiguration %>
<script runat=server>
void Page_Load(object sender SystemEventArgs e)
{
string connString = WebConfigurationManagerConnectionStrings
[adventureWorks]ConnectionString;
using (SqlConnection connection = new SqlConnection(connString))
{
connectionOpen();
SqlCommand command = new SqlCommand(Select * from ProductionProductSubCategory as Categories +
for xml autoelements connection);
XmlReader reader = commandExecuteXmlReader();
XPathDocument xpathDoc = new XPathDocument(reader);
string xslPath = ServerMapPath(App_Data/Categoryxsl);
XslCompiledTransform transform = new XslCompiledTransform();
transformLoad(xslPath);
XsltArgumentList argsList = new XsltArgumentList();
string backGroundColor = Tan;
argsListAddParam(BackGroundColor backGroundColor);
DateTimeConverter converter = new DateTimeConverter();
argsListAddExtensionObject(urn:DateTimeConverter converter);
transformTransform(xpathDoc argsList ResponseOutput);
}
}
</script>
在上面的代码中要留意的是首先实例化了DateTimeConverter类然后通过XsltArgumentList的 AddExtensionObject方法增加其扩展对象其中用urnDateTimeConverter的方式指明了其扩展对象的别名