前面已经介绍了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),结果如下: ![]() 一、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文件,如下: ![]() 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:template match="歌曲"> <xsl:apply-templates select="名称"/><br/> </xsl:template> 再次通过浏览器打开songs.xml文件,如下图: ![]() 我们再次修改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文件,如下图: ![]() 不知道大家有没有注意,在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> |
|
来自: 英昌知识汇聚馆 > 《XSLT(XPATH,XML)》