<script type="text/javascript"> google_ad_client = "pub-5033576919944123"; google_ad_width = 728; google_ad_height = 90; google_ad_format = "728x90_as"; google_ad_type = "text_image"; //2007-10-24: csdn.blog google_ad_channel = "8548491739"; </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
XML認證教程,第 4 部分: XSL樣式單 |
對於一批XML數據,應用處理程序要綜合XML文檔、文檔類型說明(Dtd/Schema) 以及樣式單三方面要素來處理和顯示它。 對於一批XML數據,應用處理程序要綜合XML文檔、文檔類型說明(Dtd/Schema)以及樣式單三方面要素來處理和顯示它。 在XML文檔中只包含了數據信息,並沒有涉及文檔如何顯示。不錯,制定XML標準的目的是要使數據結構化,賦予其明確的語意,使之易於進行數據交換。XML早已不再把目光侷限在文字圖象的顯示上,而是要建立它們之間的內在關係。可以說,XML文檔本身是重內容而不重形式。 可是,XML結構化地組織信息固然好,但如果不加修飾地把一大堆枯燥的數據擺在那裏,也足以令人眼花頭痛。 樣式單(StyleSheet)是一種專門描述結構文檔表現方式的文檔,它既可以描述這些文檔如何在屏幕上顯示,也可以描述它們的打印效果,甚至聲音效果。樣式單一般不包含在XML文檔內部,而以獨立的文檔方式存在。 樣式單可以實現非常複雜的顯示效果,但由於樣式描述與數據描述相分離,顯示細節的描述並不影響文檔中數據的內在結構。 樣式單的最大優點是:XML關於文檔瀏覽的基本思想是將數據與數據的顯示分別定義。這樣一來,XML格式文檔不會重蹈某些HTML文檔結構混雜、內容繁亂的覆轍,XML的編寫者也可以集中精力於數據本身,而不受顯示方式的細枝末節的影響。不僅如此,樣式單還帶來另一個好處,即定義不同的樣式表可以使相同的數據呈現出不同的顯示外觀,從而適合於不同應用,甚至能夠在不同的顯示設備上顯示。這樣,XML數據就可以得到最大程度上的重用性,滿足不同的應用需求。 W3C已經給出了兩種樣式單語言的推薦標準,一種是層疊樣式單CSS(Cascading Style Sheets),另一種是可擴展樣式單語言XSL(eXtensible Stylesheet Language)。本章講的是XSL。 XSL本身就是一個XML文檔,它是通過XML進行定義的,遵守XML的語法規則,是XML 的一種具體應用。因此係統可以使用同一個XML解釋器對XML文檔及其相關的XSL文檔進行解釋處理。XSL由兩大部分組成:第一部分描述瞭如何將一個XML文檔進行轉換,轉換爲可瀏覽或可輸出的格式;第二部分則定義了格式對象FO(fomatted object)。由於到目前爲止,W3C還未能出臺一個得到多方認可的FO,因此本章主要XML變換--XSL transformations(XSLT)。現在一般所說的XSL大都指的是XSLT。 XSLT主要的功能就是轉換,它將一個沒有形式表現的XML內容文檔作爲一個源樹,將其轉換爲一個有樣式信息的結果樹。在XSLT文檔中定義了與XML文檔中各個邏輯成分相匹配的模板,以及匹配轉換方式。它可以很好地描述XML文檔向任何一個其它格式的文檔作轉換的方法,例如轉換爲另一個邏輯結構的XML文檔、HTML文檔、 XHTML文檔、VRML文檔、SVG文檔等等,不一而足。 使用XSL定義XML文檔顯示方式的基本思想是:通過定義轉換模板,將XML源文檔轉換爲帶樣式信息的可瀏覽文檔。 限於目前瀏覽器的支持能力,大多數情況下是轉換爲一個HTML文檔進行顯示。 在XML中聲明XSL樣式單的方法爲:<?xml-stylesheet type="text/xsl" href="mystyle.xsl"?> 下面是一個具體的xslt樣式單文檔:
將上例的XML文檔用XSL樣式轉換爲HTML文檔的步驟是:先用XML解釋器將XML文檔解釋成DOM對象,相當於建立了原文檔的一個節點樹。然後用XML解釋器解釋XSL文檔,用模板匹配的方法去遍歷XML節點樹,將樹中的節點按模板的設定轉換爲模板指示的顯示語言,即HTML語言。 要了解這段程序,就要先了解模板。xsl:template是模板元素,用於定義模板,通常每個xsl:template有一個節點匹配屬性,由"match="指定。在對模板進行匹配時使用"xsl:apply-templates",用"select"屬性選擇要匹配的模板,相當於一個調用的過程。比如在 如果在xsl:apply-templates語句中沒有指定select屬性,那麼就調用所有可以調用的模板。 接着介紹xslt常用的幾條語句。
在作過XML聲明和XSL聲明之後,系統最先匹配XML源樹的根節點。根節點用"/"表示,它的匹配方法在一對<xsl:template match="/">括起的源碼中聲明。按照這段代碼,首先生成帶有樣式信息的HTML文檔的開頭一段代碼:
接着,系統看到了<xsl:apply-templates select="學生花名冊"/>的指示,於是,它在XML源樹中尋找標記爲“學生花名冊”的節點進行匹配。就象函數調用一樣,現在系統跳到了用<xsl:template match="學生花名冊">括起的“函數”中繼續生成下面的 HTML代碼:
現在,系統又接到了新的指示 <xsl:for-each select="學生" order-by="名字">。這條指示要求系統尋找標記爲“student”的子節點,並按照“名字”下的內容將這些節點排序,然後一一處理。 對於每一個“學生”子樹中的內容,系統爲其生成表中一行的內容。每一行包含四列,分別把標記爲“名字”、“籍貫”、“年齡”、“電話號碼”的子節點的內容填進去。其中“名字”下的內容還是粗體顯示。對應到本例中的XML數據,生成的HTML代碼爲:
處理完<xsl:for-each select="學生" order-by="名字">中的內容,系統繼續生成HTML代碼:
至此,系統已處理完<xsl:template match="學生花名冊">中的所有內容,可以“函數返回”了。系統返回到<xsl:template match="/">括起的源碼中,完成HTML最後兩行代碼的生成:
把上面的HTML代碼串起來,就是生成的轉換結果文件。 前面說過,XSLT文檔本身是XML文檔,因此文檔的第一句自然是:
接下來是樣式單部分:
xmlns:xsl指示了XSL的命名空間,在XSLT標準中,定義了XSLT的命名空間爲 http://www.w3.org/1999/XSL/transform,然而在ie5中不支持這個名字空間,需要用到微軟自己的名字空間http://www.w3.org/tr/WD-xsl。 XSLT在進行轉換時,首先遍歷XML源文檔樹,找到要處理的節點,然後將定義好的模板信息施加到該節點中。 xsl:template元素有一個mode屬性,可以根據需要去匹配不同模式的模板。若將前例作如下修改:
如果要將TITLE輸出爲藍色,則用下面語句匹配: 如果要將title輸出爲紅色,則寫爲: 此外,模板總是與節點相對應的,一個節點可能對應於不同的模板,那麼如何確定各模板匹配的先後次序呢?XSLT中可爲xsl:template設置優先級,寫法是: 在使用XSLT進行轉換時,常常需要獲取節點值,使用xsl:value-of元素可達到這個目的,如下例: 得到的是學生原籍的值,select屬性指定要獲取的是哪一個節點的節點值。 使用xsl:for-each可對所選節點依次進行處理,如例中在生成表格處理中,就是利用循環將各個學生的信息取出放入表格中的,寫法是:
可以認爲<xsl:for-each select="">能實現多個 <xsl:apply-templates select="">的功能。 對於用xsl:for-each或xsl:apply-templates匹配的節點,可使用xsl:sort將所選節點內容進行排序
XSLT是一個動態的樣式單,在處理過程中可產生新的元素或元素屬性,方法如下:
在對XML文檔進行處理時,XSLT還可以通過拷貝的方式複製節點,方法是利用 xsl:copy和xsl:copy-of。其中xsl:copy只拷貝當前節點,不包括子節點和屬性;而xsl:copy-of的拷貝內容則包括當前節點、子節點和屬性。例如對於: 如果樣式單寫爲如下形式:
轉換後生成如下代碼:
由此可見,兩種拷貝方式結果大相徑庭。 XSLT是一個轉換語言,它的目的是將XML源文檔轉換爲另一種格式文檔,它的輸出結果可以是HTML文檔,也可以是帶CSS的XML文檔。具體的輸出格式由xsl:output 指定。如果要輸出爲HTML文檔,則寫爲: <xsl:output method="html"/> 同樣,要輸出XML文檔寫爲: <xsl:output method="xml"/> 如果文檔中不出現xsl:output,將缺省輸出爲XML文檔,但如果在匹配模板時使用了 <HTML>標記,則輸出爲HTML文檔。輸出爲HTML文檔時系統都會自動加上下面語句: <!DOCTYPE html PUBLIC "-//W3C//Dtd HTML 4.0 transitional//EN"> 此外,還可以利用xsl:output指定編碼方式,如UTF-8,UTF-16,GB2312等。例如: <xsl:output method="html" encoding="GB2312"/> 它指定了該XSLT的輸出結果是HTML格式,編碼方式爲中文。 |
<script type="text/javascript"> google_ad_client = "pub-5033576919944123"; google_ad_width = 728; google_ad_height = 90; google_ad_format = "728x90_as"; google_ad_type = "text_image"; //2007-10-24: csdn.blog google_ad_channel = "8548491739"; </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>