使用ASP.NET页面创建可视的UI,在客户机上实例化MSXML分析器的页面从中间层组件取出XML数据、操作并显示 并有问题请高手解决
1. 一个简单案例:客户机通过输入用户ID或用户名称搜索用户,客户机使用Ie5.0及以上版本。
2. 基本思路:将要发送的客户机的XML数据来至于数据访问层,数据被数据访问组件外置成DataSet,从DataSet提取XML数据并使用DataSet的GetXml或WriteXml方法将数据传递到客户机,然后通过网络将XML作为纯文本传送给客户机,在客户机它被加载到客户机端XML分析器准备使用。
3. 具体实现(代码仅供参考):
中间层组件 customer-data.aspx:从数据库中取出数据生成DataSet,并返回Xml文档。
Page_Load
{
DataSet ds=new DataSet();
ds=GetDataSet();
Response.ContentType="text/xml";
Response.Write("<?xml version='1.0'?>");
ds.WriteXml(Response.OutputStream);
}
HTML表示层(客户机端):
(1)用javascript声明一个全局变量保存MSXML分析起实例,创建一个loadCustomerList函数,此函数以声明中间层组件的URL开始,实例化需要的MSXML分析器对象,同时检查实例化是否成功。
<body onload="loadCustomerList()">
var objXMLData ;
function loadCustomerList() {
var strURL = 'customer-data.aspx';
try {
objXMLData = new ActiveXObject('MSXML2.FreeThreadedDOMDocument'); //使用MSXML分析器版本2,并且使用免费的线程版本(因为后面要用到XSLT样式表)
}
catch(e) {}
if (objXMLData == null) {
//报错,提示没有安装正确的MSXML版本
return;
}
objXMLData.onreadystatechange = changeFunction; //changeFunction函数负责在XML已经结束加载时监督检查
objXMLData.validateOnParse = true; //有效性验证
objXMLData.async = true; //异步加载XML
objXMLData.load(strURL); //加载XML文档
}
function changeFunction() {
// 检查XML分析器的readyState值
// 当值为4时,表明加载或者完成了或者在加载XML时出现了错误
if (objXMLData.readyState == 4) {
if (objXMLData.parseError.errorCode != 0)
//加载XML时出现了错误
else {
//加载完成
}
}
}
(2)查找并显示顾客详细资料: 用户使用文本搜索框来搜索客户而不发生给服务器的回送,不管执行多少次搜索(为了提供更高更快的响应和用户接口)。
<button id="btnSearch" onclick="doSearch('CustomerID')"></button>
function doSearch(strSortOrder) {
//得到用户ID或用户姓名,strSortOrder是排序参数
//转换XML文档 并把转化后的结果存入一变量
var strResult = getStyledResult(strCustID, strCustName, strSortOrder);
if (strResult.length > 0) {
//呈现strResult
}
else {
//没有符合的数据
}
}
function getStyledResult(strCustID, strCustName, strSortOrder) {
//使用XSLT样式表转换XML文档
//建立XPath字符串
if (strCustID.length > 0)
var strXPath = 'descendant::Customers[starts-with(child::CustomerID, $custid)]'
else
var strXPath = 'descendant::Customers[contains(child::CompanyName, $custname)]';
//创建样式表代码
var strStyle = '<?xml version="1.0" ?>\n'
+ '<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">\n'
+ ' <xsl:param name="custid" />\n'
+ ' <xsl:param name="custname" />\n'
+ ' <xsl:template match="/">\n'
+ ' <table id="tblCustomers" cellspacing="0" cellpadding="5"\n'
+ ' rules="cols" border="1" style="border-collapse:collapse;">\n'
+ ' <tr style="background-color:silver;">\n'
+ ' <td align="center">\n'
+ ' <a href="javascript:doSearch(\'CustomerID\')"><b>ID</b></a>\n'
+ ' </td>\n'
+ ' <td align="left">\n'
+ ' <a href="javascript:doSearch(\'CompanyName\')"><b>Customer Name</b></a>\n'
+ ' </td>\n'
+ ' <td align="left">\n'
+ ' <a href="javascript:doSearch(\'City\')"><b>City</b></a>\n'
+ ' </td>\n'
+ ' <td></td>\n'
+ ' </tr>\n'
+ ' <xsl:for-each select="' + strXPath + '">\n'
+ ' <xsl:sort select="' + strSortOrder + '" data-type="text" order="ascending" />\n'
+ ' <tr>\n'
+ ' <td align="center" style="background-color:#add8e6;">\n'
+ ' <xsl:value-of select="CustomerID" />\n'
+ ' </td>\n'
+ ' <td align="left">\n'
+ ' <a>\n'
+ ' <xsl:attribute name="href">\n'
+ ' view-orders.aspx?customerid=<xsl:value-of select="CustomerID" />\n'
+ ' </xsl:attribute>\n'
+ ' <xsl:value-of select="CompanyName" />\n'
+ ' </a>\n'
+ ' </td>\n'
+ ' <td align="left">\n'
+ ' <xsl:value-of select="City" />\n'
+ ' </td>\n'
+ ' <td align="left">\n'
+ ' <a>\n'
+ ' <xsl:attribute name="href">\n'
+ ' ../../update-orders/ie5/edit-orders.aspx?customerid=<xsl:value-of select="CustomerID" />\n'
+ ' </xsl:attribute>\n'
+ ' Edit Orders\n'
+ ' </a>\n'
+ ' </td>\n'
+ ' </tr>\n'
+ ' </xsl:for-each>\n'
+ ' </table>\n'
+ ' </xsl:template>\n'
+ '</xsl:stylesheet>';
var objXMLStyle = new ActiveXObject('MSXML2.FreeThreadedDOMDocument');
objXMLStyle.loadXML(strStyle);
var objTemplate = new ActiveXObject('MSXML2.XSLTemplate'); //创建一个MSXML XSLTemplate实例,并指定它的stylesheet属性
objTemplate.stylesheet = objXMLStyle;
var objProc = objTemplate.createProcessor(); //创建一个XSLProcessor对象
objProc.input = objXMLData; //处理objXMLData文档
objProc.addParameter('custid', strCustID); //指定参数
objProc.addParameter('custname', strCustName);
if (objProc.transform() == true) //判断是否转换成功
var strResult = objProc.output
else
var strResult = '';
return strResult;
}
以上就是实现的基本思路和主要代码,如果有哪位老兄正在研究分布式数据应用,请一起讨论啊!
并有以下问题需要解决:
如何通过XSLT转换进行分页处理??