最近做追溯系统,需要展示的数据流来源是xml流,所以考虑使用xsl来转换成html来展示,由于第一次使用,遇到很多困难,上网查了很多资料后,总算是做的能看看了,下面把代码贴出来。
首先,xml文件
<?
xml version="1.0" encoding="utf-8" standalone="yes"
P0807-XC
燃油气锅炉
Model1-XC
2008-2-26 15:12:47
监检报告编号
Report-XC-004
监检报告编号
山东省特检院-XC
30d345e6c005978c
设计许可号
设计许可号
2008-2-21 0:00:00
制造许可证编号
制造许可证编号
质保书编号
XC-007
质保书编号
上述为获得的xml的简单示例,其中各个节点名称都是动态的,所以在xsl中不能写死。
下面贴出还算过得去的xslt文件
<?
xml version='1.0'
xsl:stylesheet
xmlns:xsl
="http://www.w3.org/1999/XSL/Transform"
version
="1.0"
xsl:template
match
="//*"
="Verdana"
TABLE
cellspacing
cellpadding
xsl:variable
="product"
select
="name()"
xsl:for-each
select
="./*"
xsl:variable
="process"
select
="name()"
xsl:for-each
select
="././*"
xsl:variable
="record"
select
="name()"
table
cellspacing
cellpadding
width
="600px"
bordercolorlight
="#6699FF"
bordercolordark
="#FFFFFF"
bgcolor
="#99ccff"
class
="info"
Width
="200px"
设备名称:
<
xsl:value-of
select
="$product"
Width
="200px"
环节名称:
<
xsl:value-of
select
="$process"
Width
="200px"
xsl:value-of
select
="$record"
table
table
bgcolor
="#ccffcc"
cellspacing
cellpadding
width
="600px"
border
bordercolorlight
="#6699FF"
bordercolordark
="#FFFFFF"
xsl:for-each
select
="./././*"
xsl:variable
="nname"
select
="name()"
class
="info"
Width
="200px"
xsl:value-of
select
="name()"
:
</
class
="info"
width
="400px"
xsl:value-of
select
xsl:text
disable-output-escaping
="yes"
nbsp;
xsl:text
xsl:for-each
table
xsl:for-each
xsl:for-each
TABLE
xsl:template
xsl:stylesheet
<xsl:template match="//*">中的"//*"表示匹配xml文档的根节点下的所有节点,这里因为要获取根节点的名称,所以不能直接匹配"/"(全文档)
<xsl:variable name="product" select="name()"/>
定义了变量product 用于存放根节点名称。select="name()"只能用于取得当前匹配层的节点名称,这点需要注意。再者,variable变量只能定义一次值,不能改变其值,且作用域限于当前template。
<xsl:for-each select ="./*"> 循环操作 select指定循环的节点匹配。
select="./*" 表示循环下一层节点。./表示在template指定的层数下移一层,*表示所有节点。
其中指定select=value 时 value可有多种表达方式。可以指定为具体的节点名称,如 select = "生产制造“ 如果能够确定节点名称的话。
也可以加入判定条件,如 select = "./*[name()=生产制造" 或者 select="./*[name()=$product]" 这里$product是前面定义的变量。$变量名是使用变量的方法。
<xsl:value-of select="$record"/> 这里是输出该节点的内容,或者变量的值。 当你一层层扒开xml的外衣的时候,最终取得果实的就是他了。
<xsl:value-of select="nodeName"/> 表示输出接点名为nodeName的节点的ContentValue。当然也可以输出属性,属性用select="@属性名"来指定,但是这里的属性为当前层的节点的属性,如果在循环内部,即为循环的节点的属性。输出属性的时候也可以指定属性的层,如select = "
*/@name
"表示输出循环下每一层的name属性的值。
基本上现在掌握的也就这样吧,xslt还是很强大的,以后有机会慢慢学习吧。