在HTML,JSP当中使用XML与XSL展示部分数据

HTML,JSP当中使用XMLXSL展示部分数据

 

需求分析:

通常项目当中有一些固化或不经常变化的内容,且这些内容通常是使用XML保存。

但在前台页面上需要使用到这些数据,而且有可能会将其中的内容做为网页的一部分用来展示给用户。通常的做法是使用JavaScript读取这个XML进行解释,然后再创建相应的HTML标签,并将内容插入相应的位置上。这种做法不但需要编写大量的JS,而且会影响页面加载速度。如果利用XML+XSL进行数据的格式转化,再利用JS动态加载XMLXSL,便可以很方便的获取所需的数据,而且调用不同的XSL,可以展示不同的格式。

所牵涉到的基本技术:

1:XML

2:XPATH

3:JavaScript

先看一个示例:

如图

 

 

Xml代码 复制代码
  1. <root>  
  2.     <!-- i_ID,n_名称,p_上一级ID,s_是否有下级  -->  
  3.     <a i="107" n="安徽省" p="0" s="false"/>  
  4.     <a i="93" n="北京市" p="0" s="false"/>  
  5.     <a i="103" n="北京市" p="93" s="false"/>  
  6.     <a i="77" n="长宁区" p="67" s="true"/>  
  7.     <a i="105" n="朝阳区" p="103" s="false"/>  
  8.     <a i="91" n="崇明县" p="67" s="true"/>  
  9.     <a i="89" n="奉贤区" p="67" s="true"/>  
  10.     <a i="108" n="福建省" p="0" s="false"/>  
  11.     <a i="109" n="甘肃省" p="0" s="false"/>  
  12.     <a i="110" n="广东省" p="0" s="false"/>  
  13.     <a i="101" n="广西区" p="0" s="false"/>  
  14.     <a i="111" n="贵州省" p="0" s="false"/>  
  15.     <a i="112" n="海南省" p="0" s="false"/>  
  16.     <a i="130" n="合肥市" p="107" s="false"/>  
  17.     <a i="113" n="河北省" p="0" s="false"/>  
  18.     <a i="114" n="河南省" p="0" s="false"/>  
  19.     <a i="102" n="黑龙江" p="0" s="false"/>  
  20.     <a i="80" n="虹口区" p="67" s="true"/>  
  21.     <a i="97" n="湖北省" p="0" s="false"/>  
  22.     <a i="96" n="湖南省" p="0" s="false"/>  
  23.     <a i="75" n="黄浦区" p="67" s="true"/>  
  24.     <a i="115" n="吉林省" p="0" s="false"/>  
  25.     <a i="85" n="嘉定区" p="67" s="true"/>  
  26.     <a i="116" n="江苏省" p="0" s="false"/>  
  27.     <a i="117" n="江西省" p="0" s="false"/>  
  28.     <a i="86" n="金山区" p="67" s="true"/>  
  29.     </root>  <!-- 演示数据,与图片所示有所不同-->   

 

 

以上是一个地区的XML文档,其中包含了三级省市区数据,通过属性"p"来寻找上一级,如果p=0,则代表当值数据为省份(顶级)

 

 

 

 

Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.         <!--定义当前XML文档为xsl格式-->  
  3. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  4.     <!--math表示匹配当前XML所有内容,也可以指定具体的某些值,取值方式参考XPATH语法-->  
  5. <xsl:template match="/">  
  6.     <!--在此可以编写HTML代码-->  
  7.     <h2>地区下拉表</h2>  
  8.     <div>  
  9.         <div>省市:</div>  
  10.         <div>  
  11.             <select>  
  12.                 <!--读取root下所有属性p=0的a标签,进行循环-->  
  13.                 <xsl:for-each select="root/a[@p='0']">  
  14.                     <!--对于需要给HTML标签赋值时,只能使用{}来取值,   
  15.                         不可以使用<xsl:value-of>的形式取值。这里取的是当前标签的i属性的值,   
  16.                         因为是在循环里,所以每次取值都不同-->  
  17.                     <option value="{@i}">  
  18.                         <!--如果是在HTML内,或外面赋值,则只能使用<xsl:value-of>的形式取值,   
  19.                         这里取的是当前标签的n属性的值-->  
  20.                         <xsl:value-of select="@n"/>  
  21.                     </option>  
  22.                 </xsl:for-each>  
  23.             </select>  
  24.         </div>  
  25.     </div>  
  26. </xsl:template>  
  27. </xsl:stylesheet>  
  28.       

 

 

 

三、在准备好了XML,XSL之后,剩下的事就是如何在页面上根据需要调用此XML文档来显示了,这里我们需要使用JS来加载XMLXSL并对其进行解析。由于IEFF解析XMLXSL的方法及加载XML的方法不同,所以这里采用jquery框架进行判断,也可以自行写相关的方法以区别IE/FF的不同。

用到的两个最主要的方法

1:load(xmlPath) 所有方法都有部分代码基于jquery

 

Js代码 复制代码
  1. //兼容大部分浏览器  读取外部XML文档返回xmlDoc对象   
  2. function load(x) {   
  3.     var xmlDoc;   
  4.     if ($.browser.msie) {   
  5.         xmlDoc = new ActiveXObject("Microsoft.XMLDOM");   
  6.         xmlDoc.async = false;   
  7.         xmlDoc.load(x);   
  8.         return xmlDoc;   
  9.     } else if ($.browser.safari) {   
  10.         xmlDoc = getxml(x).responseXML;   
  11.         return xmlDoc;   
  12.     } else if ($.browser.mozilla) {   
  13.         xmlDoc = document.implementation.createDocument(''''null);   
  14.         xmlDoc.async = false;   
  15.         xmlDoc.load(x);   
  16.         return xmlDoc;   
  17.     } else {   
  18.         xmlDoc = getxml(x).responseXML;   
  19.         return xmlDoc;   
  20.     }   
  21. }   
  22.   
  23. //供load方法调用   
  24. function getXmlHttp() {   
  25.     var xmlhttp;   
  26.     if (window.ActiveXObject) {   
  27.         try {   
  28.             xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");   
  29.         }   
  30.         catch (e) {   
  31.             xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");   
  32.         }   
  33.         return xmlhttp;   
  34.     } else if (window.XMLHttpRequest) {   
  35.         xmlhttp = new XMLHttpRequest();   
  36.         return xmlhttp;   
  37.     }   
  38.     return xmlhttp;   
  39. }   
  40. //供load方法调用   
  41. function getxml(x) {   
  42.     var xmlhttp = getXmlHttp();   
  43.     if (xmlhttp != null) {   
  44.         xmlhttp.open("GET", x, false);   
  45.         xmlhttp.send(null);   
  46.         return(xmlhttp);   
  47.     } else {   
  48.         alert("对不起,您的浏览器不支持 XMLHTTP.11");   
  49.         return false;   
  50.     }   
  51. }     

2:showXML() 在网页上显示XML内容,并使用相应的XSL进行解析

<!--EndFragment-->

Js代码 复制代码
  1. /**  
  2.  * 加载XML及对应的XSL文档,直接在页面上进行显示  
  3.  * @param xml XML路径  
  4.  * @param xsl XML样式文件  
  5.  */  
  6. function showXML(xml, xsl) {   
  7.     // Load XML 这里的load方法调用的是上面的laod方法   
  8.     var xmlDoc = load(xml);   
  9.     // Load XSL   
  10.     var xslDoc = load(xsl);   
  11.     // 如果是非IE浏览器,则对解析器进行重写   
  12.     if (!$.browser.msie) {   
  13.         Node.prototype.transformNode = function (oXslDom) {   
  14.             var oProcessor = new XSLTProcessor();   
  15.             oProcessor.importStylesheet(oXslDom);   
  16.             var oResultDom = oProcessor.transformToDocument(this);   
  17.             var xmls = new XMLSerializer();   
  18.             var sResult = xmls.serializeToString(oResultDom);   
  19.             if (sResult.indexOf(" <transformiix:result") > -1) {   
  20.                 sResult = sResult.substring(sResult.indexOf(">") + 1, sResult.lastIndexOf(" <"));   
  21.             }   
  22.             return sResult;   
  23.         };   
  24.     }   
  25.     document.write(xmlDoc.transformNode(xslDoc));   
  26. }     

  

 

四、到此所有准备工作已完成,可以开始编写 HTML代码,当前你也可以将这此内容放入其它的页面当中如JSP/ASP

 

<!--EndFragment-->

 

Html代码 复制代码
  1. <html>  
  2.   <head>  
  3.       <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>  
  4.       <title>Simple jsp page</title></head>  
  5.   <script type="text/javascript" src="/js/serv/comm/jquery.js"></script>  
  6.   //这个JS包含有上面的laod等方法   
  7.   <script type="text/javascript" src="/js/public/comm.js"></script>  
  8.   
  9.   <body>  
  10.     <script type="text/javascript">  
  11.                showXML("/x/comm/area.xml","/test/xml/area.xsl");   
  12.     </script>  
  13.   </body>  
  14.   
  15. </html>     
<html>
  <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
      <title>Simple jsp page</title></head>
  <script type="text/javascript" src="/js/serv/comm/jquery.js"></script>
  //这个JS包含有上面的laod等方法
  <script type="text/javascript" src="/js/public/comm.js"></script>

  <body>
    <script type="text/javascript">
               showXML("/x/comm/area.xml","/test/xml/area.xsl");
    </script>
  </body>

</html>	

 

<!--EndFragment-->

<!--EndFragment-->

 

以下附件为整个文章涉及到的内容,但不能直接在本地打开浏览,原因是load方法不能直接读取本地文件,需要部署到项目当中。

有问题或有好的建议,欢迎大家一起探讨

<!--EndFragment-->

<!--EndFragment-->

<!--EndFragment-->

二、XSL文档

 

这是一个使用XML+XSL生成的地区下拉列表。

整个演示所需文档如下:

 

一、地区信息来自XML文档

 Area.xml 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值