zsww-成功源于创新!

使用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转换进行分页处理??

posted on 2004-06-11 16:18  zsww  阅读(2783)  评论(1编辑  收藏  举报

导航