分享

XSLT语法概要

 英昌知识汇聚馆 2012-08-10
前面已经介绍了XSLT用于将一个XML文档转换成另一个XML文档或另一种类型的文档,通常我们都将其转换成HTML文档,所以本文也是以转换成HTML为例,讲解XSLT的语法。
请看下面的songs.xml文件:
<?xml version="1.0" encoding="gb2312"?>
<?xml-stylesheet type="text/xsl" href="songs.xslt"?>
<歌曲列表>
<歌曲>
<名称>夏天里的一把雨</名称>
<作曲家>张三</作曲家>
<长度>4:20</长度>
<艺术家>小天王</艺术家>
</歌曲>
<歌曲>
<名称>冬天里的一把雪</名称>
<作曲家>王五</作曲家>
<作曲家>李四</作曲家>
<长度>5:28</长度>
<艺术家>周董</艺术家>
</歌曲>
</歌曲列表>

songs.xslt文件如下:
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www./1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title>歌曲列表信息</title>
</head>
<body>
<table border="1" align="center">
<caption>歌曲列表信息</caption>
<tr>
<th>名称</th><th>作曲家</th><th>长度</th><th>艺术家</th>
</tr>
<xsl:apply-templates select="歌曲列表"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="歌曲">
<tr>
<td>
<xsl:apply-templates select="名称"/>
</td>
<td>
<xsl:apply-templates select="作曲家"/>
</td>
<td>
<xsl:apply-templates select="长度"/>
</td>
<td>
<xsl:apply-templates select="艺术家"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>

然后我们用浏览器打开songs.xml文件,我使用的版本是(IE6.0sp1),结果如下:
这样我们就将XML文件转换成了HTML文件,我们已经看到了XSLT语言的强大,下面让我们具体看看它的语法吧。(我很有耐心的写下去,希望你也很有耐心的看下去!)

一、XSL模板(xsl:template)
通过xsl:template元素定义的内容,我们就称之为XSL模板,它规定了转换器怎样将XML文件转换成其它文件(这里是HTML)。修改songs.xslt的内容,如下:
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www./1999/XSL/Transform">
<xsl:template match="/">
<html>
<head><title>练习使用xsl:template</title></head>
<body>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
然后我们通过浏览器打开songs.xml文件,浏览器显示如下:
浏览器中没有显示出什么内容,但是注意看看浏览器的标题栏。那么转换器究竟是怎么工作的呢?
我们通过浏览器打开songs.xml文件,打开后转换器载入songs.xml文件内容,载入后转换器先遇到文档节点,然后在我们定义的xsl模板(xsl:template)中寻找是否有所对应于文档节点的模板,如果有就按照定义的形式输出转换内容。那我们定义的模板有没有文档节点的模板呢,答案是,有。
<xsl:template match="/">中match属性值中的 "/"就是文档节点。输出了文档节点模板中定义的内容后,转换器会不会继续转换文档节点的子节点呢?现在还不会,因为我们没有告诉转换器继续转换,如果想继续转换它的子节点,就要用到<xsl:apply-templates>元素。

二、xsl:apply-templates
我们修改以上songs.xslt文件如下:
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www./1999/XSL/Transform">
<xsl:template match="/">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match="歌曲列表">
<head><title>练习使用xsl:template</title></head>
<body>
<xsl:apply-templates/>
</body>
</xsl:template>
<xsl:template match="歌曲">
有一首歌曲
<br/>
</xsl:template>
</xsl:stylesheet>
通过浏览器打开songs.xml文件,如下:
增加了歌曲列表模板和歌曲模板后,当我们打开songs.xml文件后,转换器又做了哪些工作呢?
1、将文档节点与样式表中的模板规则进行比较,该文档节点匹配我们定义的模板规则。
2、输出

<html>
3、文档节点模板中的<xsl:apply-templates/>元素告诉转换器继续处理文档节点的子节点。
4、将文档节点的第一个子节点(xml-stylesheet处理指令节点),与模板规则进行比较,该子节点与任何一个模板都不匹配,所以不输出任何内容。
5、将文档节点的第二个子节点(跟元素歌曲列表节点)与模板进行比较,该节点与我们定义的歌曲列表模板匹配。
6、输出
<head><title>练习使用xsl:template</title></head>
<body>
7、歌曲列表节点模板中的<xsl:apply-templates/>元素告诉转换器继续处理歌曲列表节点的子节点。
8、当遇到第一个子节点(歌曲节点),与模板规则进行比较,匹配我们定义的歌曲模板。
9、输出:
有一首歌曲<br/>
注意以上的<br/>标签,空标签必须被关闭。
10、
转换第二个子节点(歌曲节点),与模板规则进行比较,匹配我们定义的歌曲模板。
11、输出:
有一首歌曲<br/>

12、输出:
</body>
13、输出:
</html>
14、完成整个文档转换。

三、apply-templates中的select属性
将以上songs.xslt文件中的歌曲模板修改如下:
<xsl:template match="歌曲">
<xsl:apply-templates />
</xsl:template>
之后用浏览器打开songs.xml文件,如下图:
比刚才多出了很多内容,我们仔细一看是歌曲节点的子节点中的内容,我们现在先不考虑子节点中的内容是怎么输出的,但是我们应该知道,当在歌曲模板中增加<xsl:apply-templates />后,转换器就会继续转换歌曲节点的所有子节点。如果现在我只想告诉转换器只转换歌曲节点下的名称节点,那怎么办呢?修改songs.xslt文件,如下:
<xsl:template match="歌曲">
<xsl:apply-templates select="名称"/><br/>
</xsl:template>
再次通过浏览器打开songs.xml文件,如下图:
四、使用xsl:value-of计算节点值

我们再次修改songs.xslt文件的内容,如下:
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www./1999/XSL/Transform">
<xsl:template match="/">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match="歌曲列表">
<head><title>练习使用xsl:template</title></head>
<body>
<xsl:apply-templates/>
</body>
</xsl:template>
<xsl:template match="歌曲">
<xsl:value-of select="作曲家"/><br/>
</xsl:template>
</xsl:stylesheet>
然后我们用浏览器打开songs.xml文件,如下图:
看到结果后我们应该知道了,<xsl:value-of select="作曲家"/>是计算作曲家这个元素节点的值。
不知道大家有没有注意,在songs.xml文件中有三个作曲家,张三、李四和王五,但是在上例中只是输出了两个,这是为什么呢?
这是由于<xsl:value-of select="作曲家"/>只会计算第一个作曲家节点,后面的不会在进行计算,如果你想计算全部的作曲家节点,那么就应该使用xsl:for-each元素了。

五、使用xsl:for-each处理多个节点

修改songs.xslt文件歌曲模板的内容,如下:
<xsl:template match="歌曲">
<xsl:for-each select="作曲家">
<xsl:value-of select="."/><br/>
</xsl:for-each>
</xsl:template>
用浏览器打开songs.xml文件,如下图:
注意:歌曲模板中的.表示作曲家节点,也就是被循环的节点。

六、匹配节点模板

1、以下代码只匹配文档节点,/表示文档节点
<xsl:template match="/">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>

2、以下代码只匹配歌曲列表节点,match属性已经指定了节点名称
<xsl:template match="歌曲列表">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>

3、以下代码匹配所有元素节点*号表示所有节点,但是通常很少使用。
<xsl:template match="*">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
以下代码匹配以coresun:前缀的节点:
<xsl:template match="coresun:*">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>

4、以下代码匹配歌曲节点下面的名称节点
<xsl:template match="歌曲/名称">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
若xml文件如下:
<歌曲列表>
<名称>周董专集</名称>
<歌曲>
<名称>夏天里的一把雨</名称>
<作曲家>张三</作曲家>
<长度>4:20</长度>
<艺术家>小天王</艺术家>
</歌曲>
</歌曲列表>
以上模板只会匹配红颜色的名称节点,而不会匹配蓝颜色的名称节点。

5、以下代码匹配跟元素节点,/*表示根元素节点
<xsl:template match="/*">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>

6、以下代码匹配任意级别的名称节点
<xsl:template match="歌曲列表//名称">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
xml文件如下:
<歌曲列表>
<名称>周董专集</名称>
<歌曲>
<名称>夏天里的一把雨</名称>
<作曲家>张三</作曲家>
<长度>4:20</长度>
<艺术家>小天王</艺术家>
</歌曲>
</歌曲列表>
以上模板红颜色的名称节点和蓝颜色的名称节点都会匹配。

7、以下代码匹配长度节点或者艺术家节点
<xsl:template match="长度 | 艺术家">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多