xml 总结(四) xsl
一.简单的例子
1.将XML转换成HTML
XSL是如何将XML文档转换成HTML文件的呢?我们来看一个例子,下面是XML文档的一部分:
<?xml version="1.0" encoding="ISO8859-1" ?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY> USA </COUNTRY>
<COMPANY> Columbia </COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
...
然后我们将下面的 XSL文件作为HTML的模板将XML数据转换为HTML文件:
<?xml version='1.0'?>
< xsl:stylesheet xmlns:xsl ="http://www.w3.org/TR/WD-xsl">
< xsl:template match="/">
<html>
<body>
<table border="2" bgcolor ="yellow">
< tr >
< th >Title</ th >
< th >Artist</ th >
</ tr >
< xsl:for -each select="CATALOG/CD">
< tr >
<td>< xsl:value -of select="TITLE"/></td>
<td>< xsl:value -of select="ARTIST"/></td>
</ tr >
</ xsl:for -each>
</table>
</body>
</html>
</ xsl:template >
</ xsl:stylesheet >
说明:
- 。< xsl:template match="/">语句表示XML的源文档在当前目录下。
- xsl:for -each元素的作用是定位XML文档中的哪些元素需要按以下模板显示。select属性用来定义源文件中的元素名.
- xsl:value -of元素用来在当前层次中插入子元素的内容模板。
- 因为XSL样式表自身也是一个XML文档,因此,XSL文件的开头以一个XML声明开始。
-
如果为XML文档加上XSL样式表,须加上以下代码:
<?xml- stylesheet type="text/ xsl " href =" cd_catalog.xsl "?>
你的浏览器就可以精确的将XML 文档转换为HTML文件。
2.当 XML文档被转换成HTML文件,索引应该同时建立。简单的办法就是给你的for-each元素增加一个order-by属性,就 象 这样:
< xsl:for -each select="CATALOG/CD" order-by="+ ARTIST">
order-by属性带有一个"+"或者"-" 的符号,用来定义索引的方式,是升序 还是降序排列 。符号后面的名字就是要索引的关键字.
3.. XSL的过滤和查询 章 节 导 航
如果我们希望只显示满足一定的条件的 XML数据应该怎么做呢?还是上面的例子代码,我们只需要在 xsl:for -each元素的select属性中加入参数就可以,类似:
< xsl:for -each select="CATALOG/CD[ARTIST='Bob Dylan']">
参数的逻辑选择有:
= (等于)
=! (不等于)
<& 小于
>& 大于等于
和前面同样的例子 ( cd_catalog_sort.xsl ):
<?xml version='1.0'?>
< xsl:stylesheet xmlns:xsl ="http://www.w3.org/TR/WD-xsl">
< xsl:template match="/">
<html>
<body>
<table border="2" bgcolor ="yellow">
< tr >
< th >Title</ th >
< th >Artist</ th >
</ tr >
< xsl:for -each select="CATALOG/CD[ARTIST='Bob Dylan']">
< tr >
<td>< xsl:value -of select="TITLE"/></td>
<td>< xsl:value -of select="ARTIST"/></td>
</ tr >
</ xsl:for -each>
</table>
</body>
</html>
</ xsl:template >
</ xsl:stylesheet >
你可以自己测试一下,看到的结果有什么不同。
4.xsl模式
- 选择模式 <xsl:for-each>、<xsl:value-of>,和 <xsl:apply-templates>
- 测试模式 <xsl:if> 和<xsl:when>
- 匹配模式 <xsl:template>
1.选择模式:
<?xml version="1.0" encoding="gbk"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<head>
<title>使用XSL</title>
</head>
<body>
<h2 align="center">使用XSL</h2>
<table align="center" border="1">
<tbody>
<tr>
<th>Name</th>
<th>Author</th>
<th>Press</th>
<th>Price</th>
</tr>
<xsl:for-each select="Books/Book">
<tr>
<td><xsl:value-of select="Name"></xsl:value-of></td>
<td><xsl:value-of select="Author"></xsl:value-of></td>
<td><xsl:value-of select="Press"></xsl:value-of></td>
<td><xsl:value-of select="Price"></xsl:value-of></td>
</tr>
</xsl:for-each>
</tbody>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
2.模版模式:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<head>
<title>模版模式</title>
</head>
<body>
<table border="1">
<tbody>
<tr>
<th>TITLE</th>
<th>ARTIST</th>
<th>COUNTRY</th>
<th>COMPANY</th>
<th>PRICE</th>
<th>YEAR</th>
</tr>
<xsl:apply-templates select="CATALOG/CD">
</xsl:apply-templates>
</tbody>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="CD">
<tr>
<xsl:apply-templates select="TITLE"></xsl:apply-templates>
<xsl:apply-templates select="ARTIST"></xsl:apply-templates>
<xsl:apply-templates select="COUNTRY"></xsl:apply-templates>
<xsl:apply-templates select="COMPANY"></xsl:apply-templates>
<xsl:apply-templates select="PRICE"></xsl:apply-templates>
<xsl:apply-templates select="YEAR"></xsl:apply-templates>
</tr>
</xsl:template>
<xsl:template match="TITLE">
<td bgcolor="RED"><xsl:value-of></xsl:value-of></td>
</xsl:template>
<xsl:template match="ARTIST">
<td bgcolor="BLUE"><xsl:value-of> </xsl:value-of></td>
</xsl:template>
<xsl:template match="COUNTRY">
<td bgcolor="GREEN"><xsl:value-of></xsl:value-of></td>
</xsl:template>
<xsl:template match="COMPANY">
<td bgcolor="YELLOW"><xsl:value-of></xsl:value-of></td>
</xsl:template>
<xsl:template match="PRICE">
<td bgcolor="WHITE"><xsl:value-of></xsl:value-of></td>
</xsl:template>
<xsl:template match="YEAR">
<td bgcolor="BLACK"><xsl:value-of></xsl:value-of></td>
</xsl:template>
</xsl:stylesheet>
3.测试模式:
XSL中的IF,首先,介绍XSL元素<xsl:if>的语法结构:
<xsl:if>
语法:
<xsl:if expr="script-expression" language="language-name" test="pattern">
属性:
expr ──脚本语言表达式,计算结果为“真”或“假”;如果结果为“真”,且通过test,则在输出中显示其中内容(可省略此项属性)。
5.利用javascript解析xml文件
(1)客户端解析xml
在前文中,我们解释了如何用XSL将一个文档从XML转换成HTML。窍门就是向XML文件中增加一个XSL样式表,然后让浏览器来进行转换。即使这种方法能奏效,在XML文件中包含一个样式表引用也并非令人满意的方法,并且在不支持XSL的浏览器上这种方法还不能奏效。
一个更通用的方法应该是用一个JavaScript来进行从XML到HTML的转换。使用一个JavaScript,就更有以下可能性:
- 允许JavaScript进行浏览器细节测试;
- 根据浏览器和用户需求使用不同的样式表。
- 这就是XSL的美妙之处。XSL设计目的之一就是使数据从一个格式转换成另一个格式成为可能,从而支持不同的浏览器和不同的用户需求。
- 客户端XSL转换将成为未来浏览器工作任务的一个主要部分,我们还将看到专业化浏览器市场的成长,比如Braille、发声网络、网络打印机、手持PC、移动电话等。
在浏览器中将XML转换到HTML
以下是在客户机上将XML文件转换成HTML所需要的源代码,很简单:
<html> <body> <script language="javascript"> // Load XML var xml = new ActiveXObject("Microsoft.XMLDOM") xml.async = false xml.load("cd_catalog.xml") // Load the XSL var xsl = new ActiveXObject("Microsoft.XMLDOM") xsl.async = false xsl.load("cd_catalog.xsl") // Transform document.write(xml.transformNode(xsl)) </script> </body> </html> |
服务器端XSL:如何用XML解析器在服务器上将XML文档转换成HTML文档。
(2)服务器端XSL
由于不是所有的浏览器都支持XML和XSL,因此就有了一个在服务器上将XML转换成HTML的方法。
一个跨浏览器的解决方法
在前面的章节中,我们解释了如何用XSL在浏览器中将XML文档转换成HTML,窍门就是让JavaScript使用一个XML解析器来进行转换。但是当浏览器不支持XML解析器时,这种方法是不奏效的。要使XML数据对所有浏览器都可用,我们就必须在服务器上转换XML文档,并将它作为纯HTML发送到浏览器。
这是XSL的另一个美妙之处。XSL的设计目的之一是使得在服务器上将数据从一种格式转换成另一种格式成为可能,并将可读数据返回到所有未来的浏览器中。
在服务器上进行XSL转换正在成为未来Internet信息服务器工作任务的一个主要部分,同时我们将看到专用浏览器市场的发展,如:Braille、有声网络、网络打印机、手持PC、移动电话等。
在服务器端将XML转换成HTML
以下是在服务器上转换XML文件所需要的简单源代码:
<% 'Load the XML set xml = Server.CreateObject("Microsoft.XMLDOM") xml.async = false xml.load(Server.MapPath("cd_catalog.xml")) 'Load the XSL set xsl = Server.CreateObject("Microsoft.XMLDOM") xsl.async = false xsl.load(Server.MapPath("cd_catalog.xsl")) 'Transform the file Response.Write(xml.transformNode(xsl)) %> |
代码的第一块创建Microsoft XML解析器(XMLDOM)的一个例示,并将XML文件装载到内存中。代码的第二块创建解析器的另一个例示,并将XSL文档装载到内存。代码的最后一行用XSL文档转换XML文档,并将结果返回浏览器。
附录:参考文章:
- http://blog.csdn.net/baobeisimple/archive/2006/10/22/1345468.aspx
- http://blog.csdn.net/baobeisimple/archive/2006/10/22/1345477.aspx
- http://blog.csdn.net/baobeisimple/archive/2006/10/22/1345698.aspx(主要介绍xsl)
附录1.cd_catalog.xml文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited with XML Spy v4.2 -->
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tyler</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD>
<TITLE>Greatest Hits</TITLE>
<ARTIST>Dolly Parton</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>RCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1982</YEAR>
</CD>
<CD>
<TITLE>Still got the blues</TITLE>
<ARTIST>Gary Moore</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Virgin records</COMPANY>
<PRICE>10.20</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Eros</TITLE>
<ARTIST>Eros Ramazzotti</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>BMG</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1997</YEAR>
</CD>
<CD>
<TITLE>One night only</TITLE>
<ARTIST>Bee Gees</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1998</YEAR>
</CD>
<CD>
<TITLE>Sylvias Mother</TITLE>
<ARTIST>Dr.Hook</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS</COMPANY>
<PRICE>8.10</PRICE>
<YEAR>1973</YEAR>
</CD>
<CD>
<TITLE>Maggie May</TITLE>
<ARTIST>Rod Stewart</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Pickwick</COMPANY>
<PRICE>8.50</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Romanza</TITLE>
<ARTIST>Andrea Bocelli</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>10.80</PRICE>
<YEAR>1996</YEAR>
</CD>
<CD>
<TITLE>When a man loves a woman</TITLE>
<ARTIST>Percy Sledge</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Atlantic</COMPANY>
<PRICE>8.70</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Black angel</TITLE>
<ARTIST>Savage Rose</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Mega</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1995</YEAR>
</CD>
<CD>
<TITLE>1999 Grammy Nominees</TITLE>
<ARTIST>Many</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Grammy</COMPANY>
<PRICE>10.20</PRICE>
<YEAR>1999</YEAR>
</CD>
<CD>
<TITLE>For the good times</TITLE>
<ARTIST>Kenny Rogers</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Mucik Master</COMPANY>
<PRICE>8.70</PRICE>
<YEAR>1995</YEAR>
</CD>
<CD>
<TITLE>Big Willie style</TITLE>
<ARTIST>Will Smith</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1997</YEAR>
</CD>
<CD>
<TITLE>Tupelo Honey</TITLE>
<ARTIST>Van Morrison</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>8.20</PRICE>
<YEAR>1971</YEAR>
</CD>
<CD>
<TITLE>Soulsville</TITLE>
<ARTIST>Jorn Hoel</ARTIST>
<COUNTRY>Norway</COUNTRY>
<COMPANY>WEA</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1996</YEAR>
</CD>
<CD>
<TITLE>The very best of</TITLE>
<ARTIST>Cat Stevens</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Island</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1990</YEAR>
</CD>
<CD>
<TITLE>Stop</TITLE>
<ARTIST>Sam Brown</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>A and M</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD>
<TITLE>Bridge of Spies</TITLE>
<ARTIST>T'Pau</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Siren</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Private Dancer</TITLE>
<ARTIST>Tina Turner</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Capitol</COMPANY>
<PRICE>8.90</PRICE>
<YEAR>1983</YEAR>
</CD>
<CD>
<TITLE>Midt om natten</TITLE>
<ARTIST>Kim Larsen</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Medley</COMPANY>
<PRICE>7.80</PRICE>
<YEAR>1983</YEAR>
</CD>
<CD>
<TITLE>Pavarotti Gala Concert</TITLE>
<ARTIST>Luciano Pavarotti</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>DECCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1991</YEAR>
</CD>
<CD>
<TITLE>The dock of the bay</TITLE>
<ARTIST>Otis Redding</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Atlantic</COMPANY>
<PRICE>7.90</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Picture book</TITLE>
<ARTIST>Simply Red</ARTIST>
<COUNTRY>EU</COUNTRY>
<COMPANY>Elektra</COMPANY>
<PRICE>7.20</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Red</TITLE>
<ARTIST>The Communards</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>London</COMPANY>
<PRICE>7.80</PRICE>
<YEAR>1987</YEAR>
</CD>
<CD>
<TITLE>Unchain my heart</TITLE>
<ARTIST>Joe Cocker</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>EMI</COMPANY>
<PRICE>8.20</PRICE>
<YEAR>1987</YEAR>
</CD>
</CATALOG>