前面已经介绍了XSLT用于将一个XML文档转换成另一个XML文档或另一种类型的文档,通常我们都将其转换成HTML文档,所以本文也是以转换成HTML为例,讲解XSLT的语法。
请看下面的songs.xml文件:<?xml version="1.0" encoding="gb2312"?>
夏天里的一把雨名称>
张三作曲家>
4:20长度>
小天王艺术家>
歌曲>
冬天里的一把雪名称>
王五作曲家>
李四作曲家>
5:28长度>
周董艺术家>
歌曲>
歌曲列表>songs.xslt文件如下:
歌曲列表信息名称 | 作曲家 | 长度 | 艺术家 |
---|
然后我们用浏览器打开songs.xml文件,我使用的版本是(IE6.0sp1),结果如下:
这样我们就将XML文件转换成了HTML文件,我们已经看到了XSLT语言的强大,下面让我们具体看看它的语法吧。(我很有耐心的写下去,希望你也很有耐心的看下去!)
一、XSL模板(xsl:template)通过xsl:template元素定义的内容,我们就称之为XSL模板,它规定了转换器怎样将XML文件转换成其它文件(这里是HTML)。修改songs.xslt的内容,如下:<?xml version="1.0" encoding="gb2312"?>
练习使用xsl:template然后我们通过浏览器打开songs.xml文件,浏览器显示如下:
浏览器中没有显示出什么内容,但是注意看看浏览器的标题栏。那么转换器究竟是怎么工作的呢?
我们通过浏览器打开songs.xml文件,打开后转换器载入songs.xml文件内容,载入后转换器先遇到文档节点,然后在我们定义的xsl模板(xsl:template)中寻找是否有所对应于文档节点的模板,如果有就按照定义的形式输出转换内容。那我们定义的模板有没有文档节点的模板呢,答案是,有。中match属性值中的 "/"就是文档节点。输出了文档节点模板中定义的内容后,转换器会不会继续转换文档节点的子节点呢?现在还不会,因为我们没有告诉转换器继续转换,如果想继续转换它的子节点,就要用到元素。二、xsl:apply-templates我们修改以上songs.xslt文件如下:<?xml version="1.0" encoding="gb2312"?>
练习使用xsl:template有一首歌曲
通过浏览器打开songs.xml文件,如下:
增加了歌曲列表模板和歌曲模板后,当我们打开songs.xml文件后,转换器又做了哪些工作呢?1、将文档节点与样式表中的模板规则进行比较,该文档节点匹配我们定义的模板规则。
2、输出3、文档节点模板中的元素告诉转换器继续处理文档节点的子节点。4、将文档节点的第一个子节点(xml-stylesheet处理指令节点),与模板规则进行比较,该子节点与任何一个模板都不匹配,所以不输出任何内容。
5、将文档节点的第二个子节点(跟元素歌曲列表节点)与模板进行比较,该节点与我们定义的歌曲列表模板匹配。6、输出
练习使用xsl:template元素告诉转换器继续处理歌曲列表节点的子节点。8、当遇到第一个子节点(歌曲节点),与模板规则进行比较,匹配我们定义的歌曲模板。
9、输出:
有一首歌曲
注意以上的
标签,空标签必须被关闭。
10、转换第二个子节点(歌曲节点),与模板规则进行比较,匹配我们定义的歌曲模板。
11、输出:
有一首歌曲
12、输出:
13、输出:
14、完成整个文档转换。
三、apply-templates中的select属性
将以上songs.xslt文件中的歌曲模板修改如下:
之后用浏览器打开songs.xml文件,如下图:
比刚才多出了很多内容,我们仔细一看是歌曲节点的子节点中的内容,我们现在先不考虑子节点中的内容是怎么输出的,但是我们应该知道,当在歌曲模板中增加后,转换器就会继续转换歌曲节点的所有子节点。如果现在我只想告诉转换器只转换歌曲节点下的名称节点,那怎么办呢?修改songs.xslt文件,如下:
再次通过浏览器打开songs.xml文件,如下图:
四、使用xsl:value-of计算节点值我们再次修改songs.xslt文件的内容,如下:<?xml version="1.0" encoding="gb2312"?>
然后我们用浏览器打开songs.xml文件,如下图:
看到结果后我们应该知道了,是计算作曲家这个元素节点的值。不知道大家有没有注意,在songs.xml文件中有三个作曲家,张三、李四和王五,但是在上例中只是输出了两个,这是为什么呢?这是由于只会计算第一个作曲家节点,后面的不会在进行计算,如果你想计算全部的作曲家节点,那么就应该使用xsl:for-each元素了。五、使用xsl:for-each处理多个节点
修改songs.xslt文件歌曲模板的内容,如下:
用浏览器打开songs.xml文件,如下图:
注意:歌曲模板中的.表示作曲家节点,也就是被循环的节点。
六、匹配节点模板
1、以下代码只匹配文档节点,/表示文档节点
2、以下代码只匹配歌曲列表节点,match属性已经指定了节点名称
3、以下代码匹配所有元素节点,*号表示所有节点,但是通常很少使用。
以下代码匹配以coresun:前缀的节点:
4、以下代码匹配歌曲节点下面的名称节点
若xml文件如下:
周董专集名称>
夏天里的一把雨名称>
张三作曲家>
4:20长度>
小天王艺术家>
歌曲>
歌曲列表>
以上模板只会匹配红颜色的名称节点,而不会匹配蓝颜色的名称节点。
5、以下代码匹配跟元素节点,/*表示根元素节点
6、以下代码匹配任意级别的名称节点
xml文件如下:
周董专集名称>
夏天里的一把雨名称>
张三作曲家>
4:20长度>
小天王艺术家>
歌曲>
歌曲列表>以上模板红颜色的名称节点和蓝颜色的名称节点都会匹配。7、以下代码匹配长度节点或者艺术家节点