XSL簡明教程

一. XSL入門

1.XSL---XML的樣式表

HTML網頁使用預先確定的標識(tags),這就是說所有的標記都有明確的含義,例如<p>是另起一行<h1>是標題字體。所有的瀏覽器都知道如何解析和顯示HTML網頁。
然而,XML沒有固定的標識,我們可以建立我們自己需要的標識,所以瀏覽器不能自動解析它們,例如<table>可以理解爲表格,也可以理解爲桌子。由於XML的可擴展性,使我們沒有一個標準的辦法來顯示XML文檔。
爲了控制XML文檔的顯示,我們有必要建立一種機制,CSS就是其中的一種,但是XSL(eXtensible Stylesheet Language)是顯示XML文檔的首選樣式語言,它比CSS更適合於XML。

2.XSL --- 不僅僅是一種樣式表

XSL由兩部分組成:

一是轉化XML文檔;二是格式化XML文檔。

如果你不理解這個意思,可以這樣想:XSL是一種可以將XML轉化成HTML的語言,一種可以過濾和選擇XML數據的語言,一種能夠格式化XML數據的語言。(比如用紅色顯示負數。)

3.XSL --- 它能做什麼?

XSL可以被用來定義XML文檔如何顯示,可以將XML文檔轉換成能被瀏覽器識別的HTML文件,通常的,XSL是通過將每一個XML元素"翻譯"爲HTML元素,來實現這種轉換的。

XSL能夠向輸出文件裏添加新的元素,或則移動元素。XSL也能夠重新排列或者索引數據,它可以檢測並決定哪些元素被顯示,顯示多少。

4.XSL在IE5中的顯示

注意:IE5.0中,並不能完全兼容W3C組織發佈的最新XSL標準。因爲IE5.0是在XSL標準最終確定以前發佈的。微軟已經承諾在IE5.5中修正。
 

二.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:for-each元素的作用是定位XML文檔中的哪些元素需要按以下模板顯示。select屬性用來定義源文件中的元素名。指定屬性的這種語法又稱爲XML
Pattern(模式),類似文件子目錄的表示形式。xsl:value-of元素用來在當前層次中插入子元素的內容模板。

因爲XSL樣式表自身也是一個XML文檔,因此,XSL文件的開頭以一個XML聲明開始。 xsl:stylesheet元素用來聲明這是一個樣式表文件。<xsl:template
match="/">語句表示XML的源文檔在當前目錄下。

如果爲XML文檔加上XSL樣式表,看下面代碼第2行,你的瀏覽器就可以精確的將XML 文檔轉換爲HTML文件。


<?xml version="1.0" encoding="ISO8859-1" ?>

<?xml-stylesheet type="text/xsl" href="cd_catalog.xsl"?>

<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--在客戶端的實現


1.JavaScript解決方案

在上面的章節中我們已經解釋了XSL是如何將XML轉換成HTML文件。方法就是在XML文檔的頭部加入一個XSL樣式表信息,然後讓瀏覽器執行轉換過程。

這種方法在大部分情況下都做得很好,但是在不支持XML的瀏覽器中就無法正確顯示了。

一個更好的更全面的解決方案是使用Javascript來實現XML到HTML的轉換。但是使用JavaScript必須得到以下功能支持:

a.允許Javascript代替瀏覽器進行細節檢測

b.根據不同的需要和不同的瀏覽器使用不同的樣式表。

對於XSL來說這是完全可行的。設計XSL的目標之一就是允許將一種格式轉換成另一種格式,支持不同的瀏覽器,支持不同的用戶需求。未來的瀏覽器的重要任務就是在客戶端執行XSL的轉換工作

2.一個具體的實例

下面是我們上面提到的一個XML文檔(cd_catalog.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文件(cd_catalog.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">

<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>

注意,現在XML文件還沒有加入XSL樣式表,還沒有被轉換成HTML文件。

下面是用JavaSript來實現最後轉換的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>

上面代碼中使用了Javascript,如果你不知道如何寫JavaScript,您最好專門學習一下。

第一段代碼建立一個Microsoft Parser(XMLDOM)解析的對象,並將XML文檔讀入內存;第二段代碼建立另外一個對象並導入XSL文檔;最後一行代碼將XML文檔用XSL文檔轉換,並將結果輸出到HTML文件中。

四: XSL --- 在服務器端的實現


1.兼容所有的瀏覽器

在上面一章我們介紹了可以通過JavaScript調用瀏覽器的XML parser(解析軟件)來轉換XML文檔。但是這個方案依然有個問題:如果瀏覽器沒有XML
parser插件怎麼辦?(注:IE5內自帶XML parser)

爲了使我們的XML數據能被所有的瀏覽器正確顯示,我們不得不在服務器端將XML轉換成純HTML代碼,再輸出給瀏覽器。

這也是使用XSL的另一個好處。在服務器端將一種格式轉換爲另一種格式也是XSL的設計目標之一。

同樣,轉換工作也將成爲未來服務器段的主要工作。


2.一個具體實例

下面是我們上面提到的一個XML文檔(cd_catalog.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文件(cd_catalog.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">

<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>


下面是在服務器端轉換XML文件爲HTML文件的原代碼:


<%

'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"))

Response.Write(xml.transformNode(xsl))

%>

注意:我們這裏的例子採用的是ASP文件,用VBScript編寫的。如果您不瞭解ASP或者VBScript,建議閱讀有關書籍。(當然,也可以採用其他的語言編寫服務器端程序)

第一段代碼建立一個Microsoft Parser(XMLDOM)解析的對象,並將XML文檔讀入內存;第二段代碼建立另外一個對象並導入XSL文檔;最後一行代碼將XML文檔用XSL文檔轉換,並將結果輸出到HTML文件中。

五. XSL 的索引

如果我需要將元素的顯示按一定的順序排列,應該如何建立XSL的索引呢?

我們還是來看前面的例子,還是這段代碼

<?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>

.

.

.

當XML文檔被轉換成HTML文件,索引應該同時建立。簡單的辦法就是給你的for-each元素增加一個order-by屬性,就象這樣:

<xsl:for-each select="CATALOG/CD" order-by="+ ARTIST">

order-by屬性帶有一個"+"或者"-" 的符號,用來定義索引的方式,是升序還是降序排列。符號後面的名字就是要索引的關鍵字

例如(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" order-by="+ ARTIST">

<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>

最後,我們用下面的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_sort.xsl")

// Transform

document.write(xml.transformNode(xsl))

</script>

</body>

</html>

六. XSL的過濾和查詢

如果我們希望只顯示滿足一定的條件的XML數據應該怎麼做呢?還是上面的例子代碼,我們只需要在xsl:for-each元素的select屬性中加入參數就可以,類似:

<xsl:for-each select="CATALOG/CD[ARTIST='Bob Dylan']">

參數的邏輯選擇有:

= (等於)

=! (不等於)

&LT& 小於

&GT& 大於等於

和前面同樣的例子(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>

你可以自己測試一下,看到的結果有什麼不同。

七. XSL 的控制語句


1.條件語句if...then

XSL同樣還有條件語句(呵呵~~好厲害吧,象程序語言一樣)。具體的語法是增加一個xsl:if元素,類似這樣

<xsl:if match=".[ARTIST='Bob Dylan']">

... some output ...

</xsl:if>


上面的例子改寫成爲:

<?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">

<xsl:if match=".[ARTIST='Bob Dylan']">

<tr>

<td><xsl:value-of select="TITLE"/></td>

<td><xsl:value-of select="ARTIST"/></td>

</tr>

</xsl:if>

</xsl:for-each>

</table>

</body>

</html>

</xsl:template>

</xsl:stylesheet>


2. XSL 的Choose

choose的用途是出現多個條件,給出不同顯示結果。具體的語法是增加一組xsl:choose,xsl:when,xsl:otherwise元素:


<xsl:choose>

<xsl:when match=".[ARTIST='Bob Dylan']">

... some code ...

</xsl:when>

<xsl:otherwise>

... some code ....

</xsl:otherwise>

</xsl:choose>


上面的例子改寫成爲:

<?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>

<xsl:choose>

<xsl:when match=".[ARTIST='Bob Dylan']">

<td bgcolor="#ff0000"><xsl:value-of select="ARTIST"/></td>

</xsl:when>

<xsl:otherwise>

<td><xsl:value-of select="ARTIST"/></td>

</xsl:otherwise>

</xsl:choose>

</tr>

</xsl:for-each>

</table>

</body>

</html>

</xsl:template>

</xsl:stylesheet>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章