一.簡單的例子
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>