虽然XML/XSLT技术具有很大的优势但在实际开发中仍然存在不小的问题其中最大的问题就是编制XSLT模板文件成本高我们在开发WEB系统中使用了很多开发工具包括VSNET的WEB窗体设计器美工人员使用的FrontPageDreamwave等等都是用于生成HTML文档的而HTML文档要求不严格很多内容还不符合XML规范因此需要使用各种方法将这些HTML文档转换为标准的XML文档然后还需要分析页面结构将这些XML文档加工成XSLT文档在目前的技术条件下这个过程成本比较大使得XML/XSLT技术难于推广和普及在此建议大家多多思考如何低成本的将HTML文档转换为XSLT文档
而且XML/XSLT技术调试比较困难对开发者要求很高这也加大了这个技术的应用成本而且目前的web系统中大量使用的WEB控件没有考虑到XML/XSLT技术这也阻碍了这种新技术的应用
使用C#执行XSLT转换
在演示程序中其中有些代码就是使用C#来执行XSLT转换的
recordaspx
演示程序中recordaspx演示了在服务器端执行XSLT转换打开这个页面的C#代码中在Page_Load函数中首先是查询数据库并生成一个包含数据的XML文档然后我们使用了一个名为xsl的页面参数这个参数就指定了使用XSLT模板文件若用户指定了该参数我们开始执行XSLT转换
首先是创建一个XslTransform对象调用它的Load函数来加载用户指定的XSLT模板文件然后调用它的Transform函数这个函数有四个参数第一个就是包含数据的XML文档对象第二个是XSLT转换参数的列表此处未用第三个就使输出转换结果的流对象我们就使用页面输出流最后一个是XML文档解析对象此处未用
string strXSLRef = thisRequestQueryString[xsl] ;
if( strXSLRef != null && strXSLRefLength > )
{
// 根据页面参数指定的XSLT样式表名称执行XSLT转换
strXSLRef = thisServerMapPath( strXSLRef );
SystemXmlXslXslTransform transform = new SystemXmlXslXslTransform();
transformLoad( strXSLRef );
transformTransform( XmlDoc null thisResponseOutput null );
}
可以看到在C#中执行XSLT转换是非常简单的只要创建一个XslTransform对象使用Load函数加载XSLT模板使用Transform函数来执行XSLT转换即可
recordxmlaspx
演示程序中的recordxmlaspx演示了在客户端执行XSLT转换打开这个页面的C#代码在Page_Load函数中可以看到是查询数据库并使用XmlTextWriter输出包含数据的XML文档其中有这么一段代码首先判断一个名为xsl的页面参数是否存在若存在则调用xmlwriter的WriteProcessingInstruction方法输出一段名为 xmlstylesheet的XML指令这个指令的 href 属性值就使页面参数指定的XSLT模板文件名
// 输出XSLT样式表信息头
string strXSLRef = thisRequestQueryString[xsl] ;
if( strXSLRef != null && strXSLRefLength > )
{
xmlwriterWriteProcessingInstruction(
xmlstylesheet
type=text/xsl + strXSLRef + );
}
客户端浏览器解析下载的XML文档若遇到这个这段XML指令根据其中的href属性下载XSLT模板文件然后执行XSLT转换将生成的转化结果再作为HTML文档显示出来
在这个页面中服务器端只负责输出数据XML文档并提供XSLT模板文件下载而XSLT转换就给客户端浏览器处理这样就能减少服务器端的工作量并利用客户端的运算能力
注意这里的xmlstylesheet指令只对浏览器有效一般其他的程序处理XML文档时会忽略掉这个XML指令即使我们在服务器端使用XslTransform对象执行XSLT转换这个XML指令也是毫无作用的就像不存在一样
使用C#执行XPath查询
演示程序中的recordxpathaspx就演示了使用C#执行XPath查询打开这个页面的界面设计可以看到其界面是比较简单地其中一个单行文本框用于输入XPath字符串一个大的多行文本框用于显示查询结果还有一个按钮用于点击执行操作页面代码主要在这个按钮的点击事件处理中
双击这个按钮可以看到该按钮的点击事件处理代码在该处理中首先调用CreateRecordXMLDocument函数来获得包含数据的XML文档对象生成XML文档的过程可以参考recordaspx的说明
程序生成包含数据的XML文档后在从单行的文本输入框获得用户输入的XPath字符串若用户输入的内容则对XML文档的根节点调用SelectNodes方法执行XPath查询SelectNodes函数返回一个XmlNodeList列表该列表中的元素类型是XmlNode我们遍历这个列表对其中每一个XML节点对象获得它的XML字符串然后进行输出
若用户没有输入XPath字符串则直接输出XML文档根节点的内容
在这里我们定义了GetXMLString 函数这个函数主要是返回指定的XML节点对象的带缩进的XML字符串用于取代Xml节点的OuterXml属性
小结
在本课程中我们了解了XPathXML/XSLT的基础知识并演示使用C#使用XPath和XML/XSLT技术
XML及其派生的技术都是很重要的国际标准技术对现代WEB开发具有很大的影响力XML技术是一种优质的软件开发技术因此大家要花点时间好好学习熟练掌握XML及其派生技术将大大提高大家的软件开发能力