在现有页面内创建动态 XML/XSLT 子页面






3.12/5 (11投票s)
使用 Div 和自定义的 “smartDiv” JavaScript 对象来创建一个购物模块。
引言
使用 <DIV> 元素可以为您的网页创建逻辑分区。借助 JavaScript 的帮助,Div 还可以用于更改页面的视觉外观。DIV 的关键在于 innerHTML 属性。通过操作 innerHTML,可以将页面转换为一组外观、数据和样式独立的子页面。

上面展示的是产品订购菜单和购物车。购物车使用了我的自定义 “smartDiv” JavaScript 对象。使用此对象有助于在页面内创建一个持久的、保存状态的购物模块。“smartDiv” 是一个位于外部 JavaScript 文件中的对象。它有两个参数
- XML 根名称
- 转换器(XSLT)的 URL
smartDiv 具有 “SET” 属性,用于描述 DIV 的视觉外观。
- 设置类名
- 设置位置
- 设置大小
- SetBorder
此外,它还有另一个重要的属性 xml_dom,稍后会详细解释。smartDiv 只有一个方法,即 TransformXML 方法。此函数使用 XMLHTTP 和参数 URL 来检索 XSLT。下一步使用 XSLT 将 xml_dom 转换为 HTML,并将结果写入 DIV 的 innerHTML。
function smartDiv(rootname,URL) {
  this.Display = document.createElement('div'); // create 
  this.Display.id = 'bask';
  document.body.appendChild(this.Display);
  this.Display.style.position = 'absolute'; 
  this.Display.innerHTML ='';
  
  this.SetClassName = function(cname) {
   --------------------
  }
  this.SetSize = function(w,h) {
   --------------------
  }
  this.SetPosition = function(l,t) {
   --------------------
  }
  this.SetBorder = function(bs,bc,bw) { 
   --------------------
  } 
  this.xmlHTTP = null;
  this.xml_dom = new ActiveXObject("MSXML2.DOMDocument");
  this.xml_dom.loadXML('');
  this.root = this.xml_dom.createElement(rootname);
  this.xml_dom.appendChild(this.root);
  this.xslresponse =null;
  
  this.TransformXML = function() {
    try {
      this.xmlHTTP = new ActiveXObject("Microsoft.XMLHTTP");
      this.xmlHTTP.open("GET",URL,false);
      this.xmlHTTP.send();
      this.xslresponse = this.xmlHTTP.responseText;
      
      this.xml = new ActiveXObject("Msxml2.DOMDocument.4.0");
      this.xsl = new ActiveXObject("Msxml2.DOMDocument.4.0");
      this.xml.async = false;
      this.xsl.async = false;
      this.xml.validateOnParse = false;
      this.xml.loadXML(this.xml_dom.xml);
      this.xsl.loadXML(this.xslresponse);
      this.Display.innerHTML = this.xml.transformNode(this.xsl); 
    } catch (e){
      alert(e.description);
    }
  }
}
如何使 “smartDiv” 工作
- 订购页面创建一个 smartDiv的实例。
- 每次订购的商品数量发生变化时,XML 都会相应地进行调整。
如您所见,我将此实例称为 Basket。接下来设置大小、位置和样式。同时,分配根标签的名称和 XSLT 的 URL。
function initDiv() {
 Basket = new smartDiv('Basket','basket.xslt');
 Basket.SetClassName('Border');
 Basket.SetSize(180,280);
 Basket.SetPosition(200,20);
 Basket.SetBorder('dashed','#999999',1); 
}
这就是 smartDiv 的 xml_dom 属性发挥作用的地方。
遍历 “TEXT” 元素的列表,我们将它们收集到 xml_dom 中。
看起来是这样的:
<Basket>
    <Product qty="1" name="fish" price="1.99"/>
</Basket>
现在我们所要做的就是调用 smartDiv 的 TransformXML 方法,它会为我们完成工作。结果将在 DIV 元素内显示。
smartDiv.prototype.BuildXML = function() {
 var elm = document.forms[0].elements;
 oSelection = this.xml_dom.selectNodes("//Product");
 oSelection.removeAll();
 for (var i=0; i < elm.length ;++i){
    if (elm[i].type == 'text') {
    var Product = this.xml_dom.createElement("Product");
    var attr = this.xml_dom.createAttribute("qty");
    attr.value = elm[i].value;
    Product.setAttributeNode(attr);
    attr = null;
   
    ---------------------------
    this.root.appendChild(Product);
 }} 
 this.TransformXML();
}
var Basket;
其他功能
函数 Clear 不言自明。它会清除所有 “TEXT” 元素以及 xml_dom。
function Clear() {
  var elm = document.forms[0].elements;
  for (var i=0; i < elm.length ;++i){
    if (elm[i].type == 'text') {
       elm[i].value = '';
    }
  } 
  Basket.BuildXML();
}


