需求:保留路径最后一个目录 (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

659

被折叠的 条评论
为什么被折叠?



