转:http://oss.lzu.edu.cn/blog/article.php?tid_1721.html
XSL是用来解释XML文件的语言,不过它支持的东西“太有限”了,比如,它没有提供比较直观的数组数据类型。而数组数据类型却非常有用,例如:
我们想监测某个机器的网络流量,在XML文件中我们想把单位信息和字节信息分离开来,以便在XSL中用这些信息来绘图和进行相关计算。这些单位信息有KB,MB,GB(对应1,1024,1048576)等,如果流量信息特别多,我们直接发送单位信息似乎是不太好的,因为会存在很大的“冗余”,所以会考虑采取“映射“来减少XML文件的字节数中。例如:
0 --> KB, 1
|
在遇到单位的地方,全部转换为前面的0,1,2,这样每个单位信息都可以减少一个字节。然后在XSL具体解释时,把它们转换回去,但是如何转换呢?XSL没有提供数组,我们没有办法直接把0,1,2简单地作为下标从数组中取单位信息。也许你说,为什么不用条件判断呢?这个是可以,但是会影响解释XML文件的效率。
在msxsl(IE)和exsl(Opera)中,都提供了node-set()这样一个函数来使用如下一个数组变量:
Code:
<xsl:variable name="myArray"> <value>KB</value> <value>MB</value> <value>GB</value> </xsl:variable>
关于node-set()的具体用法请参考资料[1]。
不过firefox目前并不支持这个,所以还是得寻找替代方案。通过查找资料发现,key()函数[2]可以有效地解决这个问题。
它的工作原理是:
首先通过XML中的数据来建立索引,然后在template中通过给key函数传递索引值来引用索引中的数据,从而可以实现“映射”。
还是以前面的单位信息为例,先在XML文件中设计好这么一个映射数据:
Code:
<units> <unit id="0" sym=" KB" val="1"/> <unit id="1" sym=" MB" val="1024"/> <unit id="2" sym=" GB" val="1048576"/> </units>
<units>节点中的每条信息就是一个单位,其中id作为索引值,而后面分别对应单位名称和具体单位数值。
这样在XSL中我们就可以先通过下面的语句来创建一个索引:
Code:
<xsl:key name="units" match="unit" use="@id"/>
创建好索引以后就可以在template中使用了:
Code:
<xsl:template match="/"> ... <!-- 这里我们引用了索引为0的单位符号,即KB,如果想动态地进行转换,则可以把'0'用XML文件的某个节点数据替换掉 --> <xsl:value-of select="key('units','0')/@sym"/> ... </xsl:template>
例子下载:http://download.csdn.net/source/1462623
参考资料
[1] node-set() function in XSL
http://dpcarlisle.blogspot.com/2007/05/exslt-node-set-function.html
[2] key() function in XSL
http://www.w3schools.com/xsl/el_key.asp