需求:保留路径最后一个目录 (test文件)
<filePath>D:\upload\2012\test文件</filePath>
xsl使用变量样例:
<xsl:variable name="
AAA" select="substring-after(filPath,'D:\')" />
<xsl:variable name="
BBB" select="substring-after($
AAA,'.')" />
<xsl:variable name="
CCC" select="substring-after($
BBB,'.')" />
<xsl:value-of select="$
CCC"/>
#xsl使用变量范例
<xsl:variable name="a" select="substring-after(filePath,':\')" /> <!-- 第1级chose --> <xsl:choose> <xsl:when test="contains($a,'\')"> <!-- 第2级chose --> <xsl:choose> <xsl:when test="contains($b,'\')"> <xsl:variable name="c" select="substring-after($a,'\')" /> <xsl:value-of select="$c" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="$b" /> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:value-of select="$a" /> </xsl:otherwise> </xsl:choose>
//xsl中打印空格 //xsl中空格使用: 代替 或者 
xsl应用实例
技术点:
- 1 声明全局变量;
- 2大小写转换;
- 3返回模板;
- 4xsl除法;
- 5xsl浮点格式化;
- 6choose使用;
- 7xsl使template自定义模板和使用call-template调用自定义模板
#下边是xml文件和xsl文件实例
<?xml version="1.0" encoding="UTF-8" ?> <list> <TaskinstanceInfo> <pkid>2919</pkid> <taskdefineId>2</taskdefineId> <enodeTaskinsId>0</enodeTaskinsId> <taskStatus>COMPLETE</taskStatus> <startTime>2012-07-10 15:34:12.0 CST</startTime> <lastCompleteTime>2012-07-11 12:00:00.0 CST</lastCompleteTime> <filePath>D:\upload\2012\test\a\b\c\d\e\f</filePath> <!-- 单位:字节 --> <fileSize>122420</fileSize> <fileFormat>E00</fileFormat> <processInfo>中心处理中</processInfo> <updateType>INCREMENT</updateType> <transportType>FTP</transportType> <dataType>SPATIALDATA</dataType> <taskSourceIp>172.16.10.16</taskSourceIp> <exchangeNodeId>2</exchangeNodeId> <taskSourceDesc>null</taskSourceDesc> <taskCreaterId>4</taskCreaterId> <taskCreaterName>Tite</taskCreaterName> <taskCreaterDept>国土资源厅</taskCreaterDept> <localSourceId>d388f9d1-9453-4313-b1a2-c99fe1f84856</localSourceId> <localCatalogId>0c091601-eb5c-4747-85ee-046c358fa0ac</localCatalogId> <tranFileFormat>GDB</tranFileFormat> <sequenceState>VALID</sequenceState> <orderIndex>3</orderIndex> </TaskinstanceInfo> <TaskinstanceInfo> <pkid>2917</pkid> <taskdefineId>1</taskdefineId> <enodeTaskinsId>0</enodeTaskinsId> <taskStatus>START</taskStatus> <startTime>2012-07-09 12:00:00.0 CST</startTime> <lastCompleteTime>2012-07-12 18:00:00.0 CST</lastCompleteTime> <filePath>D:\upload\2012\test2</filePath> <!-- 单位:字节 --> <fileSize>102400</fileSize> <fileFormat>GDB</fileFormat> <processInfo>数据开始上传</processInfo> <updateType>REPLACE</updateType> <transportType>FTP</transportType> <dataType>SPATIALDATA</dataType> <taskPriority>HIGHEST</taskPriority> <taskSourceIp>172.16.10.11</taskSourceIp> <exchangeNodeId>1</exchangeNodeId> <taskSourceDesc>null</taskSourceDesc> <taskCreaterId>1</taskCreaterId> <taskCreaterName>Tite</taskCreaterName> <taskCreaterDept>国土资源厅</taskCreaterDept> <localSourceId>1e492964-2d90-4b6e-ba7d-b731b13ef960</localSourceId> <localCatalogId>0c091601-eb5c-4747-85ee-046c358fa0ac</localCatalogId> <tranFileFormat>E00</tranFileFormat> <sequenceState>VALID</sequenceState> <orderIndex>1</orderIndex> </TaskinstanceInfo> </list>
<?xml version="1.0" encoding="utf-8"?> <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> <xsl:variable name="uppercase">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable> <xsl:variable name="lowercase">abcdefghijklmnopqrstuvwxyz</xsl:variable> <xsl:template match="list"> <xsl:element name="rows"> <xsl:for-each select="TaskinstanceInfo"> <xsl:element name="row"> <xsl:attribute name="id"> <xsl:value-of select="pkid" /> </xsl:attribute> <xsl:element name="cell"> <xsl:value-of select="null" /><!--TODO null表示复选框未选中 --> </xsl:element> <xsl:element name="cell"> <img style="cursor:pointer;" alt="zip压缩包" src="images/RAR.png"/> </xsl:element> <xsl:element name="cell"> <a href="javascript:void(0)" οnclick="DataManager.detailData('<xsl:value-of select="pkid" />');"> <xsl:call-template name="get-filepath-name"> <xsl:with-param name="text" select="filePath"/> </xsl:call-template> </a> </xsl:element> <xsl:element name="cell"> <xsl:value-of select="taskCreaterDept"></xsl:value-of> </xsl:element> <xsl:element name="cell"> <xsl:value-of select="substring-before(string(startTime),' ')" /> </xsl:element> <xsl:element name="cell"> <xsl:choose> <xsl:when test="number(fileSize) > (1024*1024*1024)"> <xsl:value-of select="format-number(number(fileSize) div (1024*1024*1024),'.00')" />GB </xsl:when> <xsl:when test="number(fileSize) > (1024*1024)"> <xsl:value-of select="format-number(number(fileSize) div (1024*1024),'.00')" />MB </xsl:when> <xsl:when test="number(fileSize) > 1024"> <xsl:value-of select="format-number(number(fileSize) div 1024,'.00')" />KB </xsl:when> <xsl:otherwise> <xsl:value-of select="fileSize" /> </xsl:otherwise> </xsl:choose> </xsl:element> <xsl:element name="cell"> <a href="javascript:void(0)" οnclick="DataManager.viewSCCL('<xsl:value-of select="taskdefineId" />')"><xsl:value-of select="taskdefineId" /></a> </xsl:element> <xsl:element name="cell"> <xsl:choose> <xsl:when test="translate(taskStatus,$lowercase,$uppercase) = 'COMPLETE'"> <span style="color:green;">上传完成</span> </xsl:when> <xsl:otherwise> <span style="color:red;">上传中</span> </xsl:otherwise> </xsl:choose> </xsl:element> <xsl:element name="cell"> <a href="javascript:void(0)" style="color:#0B94A7;margin-left:10px;" οnclick="DataManager.activeData('<xsl:value-of select="pkid" />');">查看</a> | <xsl:if test="taskStatus != 'COMPLETE'"> <a href="javascript:void(0)" style="color:#A40994;" οnclick="DataManager.cancelData('<xsl:value-of select="pkid" />');">取消上传</a> </xsl:if> <xsl:if test="taskStatus = 'COMPLETE'"> <a href="javascript:void(0)" style="color:red;" οnclick="DataManager.deleteData('<xsl:value-of select="pkid" />');">删除</a> </xsl:if> </xsl:element> </xsl:element> </xsl:for-each> </xsl:element> </xsl:template> <!--获取文件路径最后文件名 --> <xsl:template name="get-filepath-name"> <xsl:param name="text"/> <xsl:choose> <xsl:when test="contains($text,'\')"> <xsl:call-template name="get-filepath-name"> <xsl:with-param name="text" select="substring-after($text,'\')"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$text"/> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
xml文件中的filePath在经过xsl处理后分别输出的是:f和test2
xsl返回带有template的html:
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/entry"> <html> <head> </head> <body> <xsl:value-of select="title" /> <xsl:value-of select="body" disable-output-escaping="yes"/> </body> </html> </xsl:template> </xsl:stylesheet>
xsl文件的标准模板:
-
match 属性的值是 XPath 表达式(举例,match="/" 定义整个文档,即
把此模板与 XML 源文档的根相联系
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <p><xsl:value-of select="catalog/cd/title"/></p> </body> </html> </xsl:template> </xsl:stylesheet>
xsl结果过滤
通过在 <xsl:for-each> 元素中添加一个选择属性的判别式,我们也可以过滤从 XML 文件输出的结果。
<xsl:for-each select="catalog/cd[artist='Bob Dylan']
">
合法的过滤运算符:
- = (等于)
- != (不等于)
- < (小于)
- > (大于)
在何处放置排序信息
如需对结果进行排序,只要简单地在 XSL 文件中的 <xsl:for-each> 元素内部添加一个 <xsl:sort> 元素:
<xsl:for-each select="catalog/cd">
<xsl:sort select="artist"/>
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
<script type="text/javascript"> // Load XML var xml = new ActiveXObject("Microsoft.XMLDOM") xml.async = false xml.load("cdcatalog.xml") // Load XSL var xsl = new ActiveXObject("Microsoft.XMLDOM") xsl.async = false xsl.load("cdcatalog.xsl") // Transform document.write(xml.transformNode(xsl)) </script>
#子节点过滤:book有name子节点,且子节点值等于xdj
<xsl:value-of select="book[name='xdj']"></xsl:value-of>
#节点属性过滤:book有name属性,且属性值等于XDJ
<xsl:value-of select="book[@name='XDJ']"></xsl:value-of>
选取节点
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
下面列出了最有用的路径表达式:
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()<3] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang='eng'] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
实例
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
路径表达式 | 结果 |
---|---|
/bookstore/* | 选取 bookstore 元素的所有子元素。 |
//* | 选取文档中的所有元素。 |
//title[@*] | 选取所有带有属性的 title 元素。 |
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
路径表达式 | 结果 |
---|---|
//book/title | //book/price | 选取 book 元素的所有 title 和 price 元素。 |
//title | //price | 选取文档中的所有 title 和 price 元素。 |
/bookstore/book/title | //price | 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。 |
XPath 运算符
下面列出了可用在 XPath 表达式中的运算符:
运算符 描述 实例 返回值
| 计算两个节点集 //book | //cd 返回所有拥有 book 和 cd 元素的节点集
div 除法 8 div 4 =2
or 或 price=9.80 or price=9.70
and 与 price>9.00 and price<9.90
mod 计算除法的余数 5 mod 2=1
var xml = new ActiveXObject("Microsoft.XMLDOM"); xml.async = false; xml.load("a.xml"); //price节点的个数 alert( xml.selectNodes("//price").length);//2 //第二个price节点的文本 alert( xml.selectNodes("//price")[1].text);//29.99 //author节点带有age属性的文本 alert( xml.selectNodes("//author[@age]")[0].text);//意大利人 //title节点存在lang属性,且lang属性=en alert( xml.selectNodes("//title[@lang='en']")[0].text);//哈利波特 //book含有Test节点的title的文本 alert( xml.selectNodes("//book[Test]/title")[0].text);//哈利波特 xml数据: <?xml version="1.0" encoding="GBK"?> <bookstore> <book category="COOKING"> <title>意大利人</title> <author age="34">达芬奇</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">哈利波特</title> <author>罗琳</author> <year>2005</year> <price>29.99</price> <Test>测试内容</Test> </book> </bookstore>
/* * 将字符串转化成XMLDom对象 * @param xmlStr xml字符串 */ function createXmlDOM(xmlStr){ var xmlDom = null; if (window.DOMParser){//FF,Chrome 等 xmlDom=new DOMParser().parseFromString(xmlStr,"text/xml"); }else{//IE only xmlDom=new ActiveXObject("Microsoft.XMLDOM"); xmlDom.async="false"; xmlDom.loadXML(xmlStr); } return xmlDom; } var xml = createXmlDOM("<?xml version=\"1.0\" encoding=\"UTF-8\"?><book><title>哈利波特</title></book>"); //原生态写法 IE,chrome,ff【推荐】 alert(xml.getElementsByTagName("title")[0].text);//哈利波特 alert("userName = " + xml.getElementsByTagName("title")[0].childNodes[0].nodeValue);//哈利波特 //IE only [不推荐] //alert( xml.selectNodes("//book/title")[0].text);//哈利波特 IE only
说明:很多内容都是摘自w3school.com
end
xml中直接使用&符号:
&
例如:?name=tom&age=12 需要写成 ?name=tom
&
age=12
愤怒的coder