xml数据岛的数据格式:
<?xml version="1.0" encoding="GBK"?> <list> <ExchangeDataInfo> <id>1e4929642d904b6eba7db731b13ef960</id> <name>abc</name> <date>20120710 14:50:22.0 CST</date> <updateDate>20120710 14:50:22.0 CST</updateDate> <size>4168</size> <desc>本文件是用于数据文件管理组件中运行测试用例使用</desc> <keyWords> <string>白图片</string> <string>数据管理</string> <string>上传</string> <string>测试</string> </keyWords> <exchangeInfo> <taskINSID>1</taskINSID> <taskSourceIP>172.16.10.30</taskSourceIP> <exchangeNodeID>1</exchangeNodeID> <taskType>EXCHANGENODEDownLOAD</taskType> <exchangeDataType>SPATIALDATA</exchangeDataType> <exchangeFileType>SHAPE</exchangeFileType> <isValid>true</isValid> <sequenceEnd>20120716 16:41:26.453 CST</sequenceEnd> <downLoadTimes>0</downLoadTimes> <orderIndex>1</orderIndex> </exchangeInfo> </ExchangeDataInfo> <ExchangeDataInfo> <id>0c091601eb5c474785ee046c358fa0ac</id> <name>又是白图片</name> <date>20120708 10:20:22.0 CST</date> <updateDate>20120708 10:20:22.0 CST</updateDate> <size>4168</size> <desc>本文件是用于数据文件管理组件中运行测试用例使用</desc> <keyWords> <string>又是白图片</string> <string>数据管理</string> <string>下载</string> <string>测试</string> </keyWords> <exchangeInfo> <taskINSID>2</taskINSID> <taskSourceIP>172.16.10.30</taskSourceIP> <exchangeNodeID>1</exchangeNodeID> <taskType>EXCHANGENODEDOWNLOAD</taskType> <exchangeDataType>SPATIALDATA</exchangeDataType> <exchangeFileType>SHAPE</exchangeFileType> <isValid>true</isValid> <sequenceEnd>20120716 16:41:26.872 CST</sequenceEnd> <downLoadTimes>2</downLoadTimes> <orderIndex>2</orderIndex> </exchangeInfo> </ExchangeDataInfo> </list>
XSL文件内容 :xsl就是xml的样式(css)
<?xml version="1.0" encoding="GBK"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wfs="http://www.opengis.net/wfs"> <!-- 可以删除 作用不明--> <xsl:output method="xml" omit-xml-declaration="no" indent="no" /> <!-- 可以删除 作用不明--> <xsl:param name="enableServiceNode"></xsl:param> <!--模板与xml数据岛匹配的节点名称,如果是/,则表示根节点,当前为list --> <xsl:template match="list"> <!-- element是输出或者说返回给用户的xml,name表示节点名称,那么这样就会输出一个rows的节点--> <xsl:element name="rows"> <!-- xsl的for-each用于循环xml数据岛中的数据--> <xsl:for-each select="ExchangeDataInfo"> <!-- 输出一个row几点--> <xsl:element name="row"> <!-- 给row节点添加一个id属性,id属性的值等于xml数据岛中的id节点的值--> <xsl:attribute name="id"> <!-- 获取xml数据岛中id节点的值--> <xsl:value-of select="id" /> </xsl:attribute> <!--输出一个cell节点 --> <xsl:element name="cell"> <!-- 获取xml数据岛中id节点的值--> <xsl:value-of select="id" /> </xsl:element> <!--输出一个cell节点--> <xsl:element name="cell"> <!--输入固定的字符,不从xml数据岛中读取数据--> images/RAR.png </xsl:element> <xsl:element name="cell"> <!--xsl的choose用法:when,otherwise--> <xsl:choose> <!-- 语法表示:如果xml数据岛中的name属性的长度大于100 string-length()方法用于获取字符串的长度 test="..."用于判断 --> <xsl:when test="string-length(name) > 100"> <!-- 给返回的数据前添加b标签,实现加粗效果,使用substring(aString,start,end)截取字符串--> <b> <xsl:value-of select="substring(name,0,100)" />...zip</b> </xsl:when> <!--否则的话,执行这段代码--> <xsl:otherwise> <!--直接输出xml数据岛中的name属性,并追加b标签--> <b><xsl:value-of select="name" /></b> </xsl:otherwise> </xsl:choose> </xsl:element> <xsl:element name="cell"> <xsl:value-of select="size" /> </xsl:element> <xsl:element name="cell"> <xsl:value-of select="date" /> </xsl:element> <xsl:element name="cell"> <!--xml数据岛是多层次的节点的使用方法:使用/号,例如:parent/son --> <xsl:if test="exchangeInfo/taskType = 'CENTERUPLOAD'"> <!--输出图片--> <img src="images/up.png"/> </xsl:if> <xsl:if test="exchangeInfo/taskType = 'CENTERDOWNLOAD'"> <img src="images/down.png"/> </xsl:if> <xsl:if test="exchangeInfo/taskType = 'EXCHANGENODEUPLOAD'"> <img src="images/up.png"/> </xsl:if> <xsl:if test="exchangeInfo/taskType = 'EXCHANGENODEDOWNLOAD'"> <img src="images/down.png"/> </xsl:if> </xsl:element> <xsl:element name="cell"> <!--添加js脚本的响应时间:通过拼凑span标签,并添加onclick实现--> <span href="#" οnclick="DataManager.downData('<xsl:value-of select="id" />')"><img style="margin:0px;padding:0px" src="images/download0.png"/></span> <span href="#" οnclick="DataManager.detailData('<xsl:value-of select="id" />')"><img style="margin:0px;padding:0px;position:relative;left:-3px;" src="images/detail0.png"/></span> <span href="#" οnclick="DataManager.deleteData('<xsl:value-of select="id" />')"><img style="margin:0px;padding:0px;position:relative;left:-6px;" src="images/del.png"/></span> </xsl:element> </xsl:element> </xsl:for-each> </xsl:element> </xsl:template> </xsl:stylesheet>
显示结果见附件:使用dhtmlxgrid的显示结果
xsl有自己的函数库,详见:http://blog.csdn.net/ccsdba/article/details/1635050 和 http://blog.163.com/chenyunpei_studio@126/blog/static/36578255200762882452192/
xsl也允许自定义函数,详见:http://hi.baidu.com/godghdai/blog/item/e8955066580ff62fab184ce9.html
但是,自定义函数在j2ee应用中,会碰到安全设置不允许的问题,所以一直没有实质性的效果。
下面是自己的尝试
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="http://supermap.com/"> <msxsl:script language="javascript" implements-prefix="user"> function GetName(node) { return (node+"aaaaaaaaaaaaaaaaf").substr(1,8); } ]]> </msxsl:script> <xsl:template match="list"> <xsl:element name="cell"><!--自定义函数的使用方法--> <b><xsl:value-of select="user:GetName(name)" /></b> <xsl:if test="string-length(name) > 3"> <b><xsl:value-of select="substring(name,0,15)" />...</b> </xsl:if> </xsl:element> </xsl:template> </xsl:stylesheet>
这种写法,在jsp页面中会提示:页面安全设置不允许在此使用函数 这样类似的提示,最终导致不能返回正常的记过。
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user ="http://www.mycompany.org/ns/function" xmlns:lxslt="http://xml.apache.org/xslt" exclude-result-prefixes="user"> <lxslt:component prefix="user" elements="rules" functions="GetName"> <msxsl:script language="javascript" implements-prefix="user"> <![CDATA[ function GetName(node) { return (node+"aaaaaaaaaaaaaaaaf").substr(1,8); } ]]> </msxsl:script> </lxslt:component> <xsl:template match="list"> .... </xsl:template> </xsl:stylesheet>
这种写法,绕开了安全设置的提示,但是会提示:命名空间不包含任何函数的提示,最终还是失败。
xsl中的除法:div方法
xsl中的数字格式化:format-number(anumber,'0.00');//表示保留两位小数
<xsl:choose> <xsl:when test="number(size) > (1024*1024*1024)"> <xsl:value-of select="format-number(number(size) div (1024*1024*1024),'.00')" />G </xsl:when> <xsl:when test="number(size) > (1024*1024)"> <xsl:value-of select="format-number(number(size) div (1024*1024),'.00')" />M </xsl:when> <xsl:when test="number(size) > 1024"> <xsl:value-of select="format-number(number(size) div 1024,'.00')" />k </xsl:when> <xsl:otherwise> <xsl:value-of select="size" /> </xsl:otherwise> </xsl:choose>
//dhtmlgrid的使用: //listServiceURL = "testdata/dataexchange1.xml";//TODO 测试数据 mygrid.parse(TransFormUtil.transForm(listServiceURL,"xslt/dataexchange.xsl",null,3));
Transform.js:
/*-----------------------通用xsl转换类(静态类)-----------------*/ /*-----------------------版本:V1.0------------------*/ /*-----------------------作者:songxw-----------------*/ ///<sumary> /// xsl转换类--用于适应firefox以及IE各版本 ///</sumary> TransFormUtil=new function() { /// <summary> /// 转换过程 /// </summary> ///<params name="xml">要转换的xml源</params> ///<params name="xsl">执行转换的式xsl模板</params> ///<params name="params">转换参数:json格式</params> ///<params name="resouceType">数据源类型:0表示xml为string/xsl为string,1表示xml为string/xsl为file,2表示xml为string/xsl为file,3表示xml为file/xsl为file</params> /// <returns>执行转换后的html结果</returns> this.transForm=function(xml,xsl,params,resouceType) { //获取浏览器版本信息 var browser=getBrowser(); var formatHtml=""; var xmlDom=BrowserAdepter.getDomDocument(); xmlDom.async = false; switch(resouceType) { //从string中加载数据源 case 0: case 1: xmlDom=BrowserAdepter.loadXML(xml); break; //从file中加载数据源 case 2: case 3: xmlDom=BrowserAdepter.load(xml); break; } //必须使用线程安全的Dom对象 var xslDom =BrowserAdepter.createFreeThreadedDocument(); xslDom.async = false; switch(resouceType) { //从string中加载数据源 case 0: case 2: xslDom=BrowserAdepter.loadXML(xsl); break; //从file中加载数据源 case 1: case 3: if(typeof xslDom.load !='undefined'){ xslDom.load(xsl); } else{ xslDom=BrowserAdepter.load(xsl); } break; } if(BrowserAdepter.getXml(xmlDom)=="") return ""; var xslTemplate =BrowserAdepter.createXSLTemplate(); //适用于IE if(browser.isIE) { xslTemplate.stylesheet =xslDom; // 创建XslProcessor对象 var xslProcessor = xslTemplate.createProcessor(); xslProcessor.input = xmlDom; //转换参数 if(params!=null && params!=undefined) { for(var key in params) { xslProcessor.addParameter(key,eval("params."+key)); } } // 执行XSLT转换 xslProcessor.transform(); formatHtml=xslProcessor.output; } //适用于firefox else { xslTemplate.importStylesheet(xslDom); //转换参数 if(params!=null && params!=undefined) { var value=""; for(var key in params) { value=eval("params."+key); xslTemplate.setParameter(null,key,value); } } var result = xslTemplate.transformToFragment(xmlDom,document); var xmls = new XMLSerializer(); formatHtml=xmls.serializeToString(result); } formatHtml=formatHtml; xmlDom=null; xslDom=null; xslTemplate=null; return formatHtml.replace("<?xml version=\"1.0\"?>",""); }; }
xsl大写转换成小写:translate(str,'A...Z','a...z')
<!--定义变量-->
<xsl:variable name="uppercase">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
<xsl:variable name="lowercase">abcdefghijklmnopqrstuvwxyz</xsl:variable>
<!--大小写转换-->
<td class="title">策略类型</td>
<td class="value"><xsl:value-of select="translate(strategyType,$uppercase,$lowercase)"/></td>
xsl中进行非空判断
<xsl:if test="processInfo !=null"> <xsl:value-of select="processInfo"/> </xsl:if>