軟體專案實訓及課程設計指導——如何應用XML+XSLT技術分離Web表示層資料和樣式
1、"XML+XSLT"技術在J2EE技術平臺中的應用
Java語言及相關的應用技術的產生解決了跨平臺的軟體應用系統的開發,但沒有解決如何實現跨平臺的資料交換問題。在傳統的軟體應用系統中,為了能夠實現在不同的系統平臺之間交換資料、同時還要保證資料的完整性,是相對比較麻煩的一件事情。
基於此應用的目的和要求,誕生了XML(eXtensible Markup Language,可擴充套件標記語言)技術。應用XML語言可以實現軟體應用系統中的"內容"與"表現"相互分離,並且XML還是一種可擴充套件的標籤語言。
如下示例圖中的程式碼為一個定義學生資訊的XML格式文件示例,讀者從此示例中可以瞭解到XML格式文件只定義資料內容(或者應用系統處理的最終結果),而這些資料或者結果最終在什麼終端裝置顯示、以及以什麼風格顯示都沒有定義。
基於XML語言及應用技術的XSLT(Extensible Stylesheet Language Transformations,擴充套件樣式錶轉換語言)的主要作用是將XML由一種格式轉換為另一種格式(當然,也可以為其它格式,如HTML網頁,純文字等),而在J2EE Web應用系統的開發實現中,應用XSLT技術能夠實現將XML格式的源文件透過轉換引擎並按照XSL(eXtensible Stylesheet Lanaguage,擴充套件樣式表語言)模板的格式最終轉換輸出目標HTML格式的文件。
如下示例圖中的程式碼為某個XSLT文件檔案的內容,其中包含有<xsl:stylesheet>、<xsl:template>等標籤,同時在<xsl:template></xsl:template>標籤內包含有一個完整的HTML檔案所應該具有的標籤。這些標籤都起什麼作用?源XML文件最終在瀏覽器中的顯示結果如何?
由於XSLT文件檔案本身也是一個 XML格式的文件,因此它也總是由如下的XML宣告語句起始:<?xml version="1.0" encoding="gb2312"?>
但由於本文章的篇幅有限,讀者如果需要詳細瞭解和學習XML、XSLT和XHTML等相關的語法、技術和應用等,可以參考作者的《J2EE Web核心技術——XHTML與XML應用開發》一書中相關章節內容。
讀者也許還會有許多的疑問,比如為什麼要多此一舉?請讀者保持耐心,繼續往下閱讀。
2、XSL技術概述及在J2EE系統平臺中的應用
(1)XSL是什麼
XSL就是可擴充套件樣式表語言(eXtensible Stylesheet Lanaguage),XSL是參考SGML(Standard Generalized Markup Language,標準通用標記語言)中的DSSSL(Document Style Semanticsand Specification Language,文件樣式語義和規範語言,它主要是用來設定SGML的表現樣式)而設計的。
(2)為什麼要提供XSL技術
儘管"CSS+Div"能夠為Web應用系統的頁面開發人員分離Web頁面中的結構和風格,從而實現分離Web頁面中的資料和表現。但如果其中的資料是採用XML格式表示,此時如果再繼續採用CSS層疊樣式表技術來為該XML格式文件資料設定表現樣式,由於CSS層疊樣式表採用的是與XML完全不同的一套語法規則定義,無法使用相同的XML解析器進行處理和解析,這為軟體應用系統專案開發帶來了許多額外的負擔。
最初設計XSL的主要目的就是希望採用XML格式的語法規則提供一種為XML文件設定表現樣式的新方法。而CSS的主要問題是由於沒有邏輯控制的能力——CSS不能重新排序文件中的元素、也不能判斷和控制哪個元素被顯示、哪個不被顯示、當然也不能統計計算元素中的資料等功能要求。
因此CSS層疊樣式表技術一般只適合用於輸出固定內容的最終Web頁面文件,但CSS層疊樣式表技術的主要優點是簡潔、消耗系統資源少;而XSLT雖然功能強大,但因為要重新索引XML結構樹,所以消耗系統記憶體量比較多。
在企業級的軟體應用系統開發中,一般常常將CSS和XSLT兩者相互結合使用。比如在Web伺服器端用XSLT處理相關的文件,而在客戶端則用CSS層疊樣式表技術來控制資料在瀏覽器端的最終顯示風格,這樣的設計方案能夠大大地減少響應時間。
3、XSL技術主要包括兩個組成部分
XSL技術主要包括兩個組成部分:XSLT(eXtensible Stylesheet Language Transformation)和XSL-FO(XSL Formatting Object)。
其中的XSLT主要是實現轉換XML格式的文件,而XSL-FO主要是格式化XML文件。其中XSL-FO的作用就類似CSS層疊樣式表技術在HTML頁面中的作用,但作者在本文中重點為讀者介紹XSLT相關的技術及應用。
因此,XSL從本質上可以看著為是一種可以將XML轉化成其它型別語言的語言、一種可以過濾和選擇XML資料的語言、一種能夠格式化XML資料的語言。
4、XSLT主要是面向轉換型別的應用
XSLT的主要作用是將XML文件資料內容由一種格式轉換為另一種格式——比如,將XML格式的文件轉換為HTML/XHTML(或者WML)等格式的文件是目前XSLT應用最為廣泛的應用領域。
為什麼要應用XSLT及相關的技術?因為XML格式的資料文件能夠便於交換但不便於人類的閱讀和理解、特別是機器自動化地閱讀。因此如何能夠按照人類的要求顯示XML格式文件中的資料?如何實現將同一個XML格式文件中的資料在不同的顯示平臺中顯示輸出?
5、XSLT資料格式轉換的基本實現原理
資料格式轉換的重要思想是要把XML格式文件視為一種樹形結構,轉換的過程其實就是從源XML格式文件樹生成結果樹的過程。其中的XSL樣式單定義了源XML格式文件樹和結果樹中對應部分的轉換規則,在每條規則中包含了一個模板,並對應著一種模式——模板定義了轉換的結果和轉換的基本規則,而模式則規定了需要進行轉換的元素或屬性物件。
6、XSLT資料格式轉換的實現過程
首先,將XML格式文件轉換為DOM(Document Object Model,文件物件模型)樹結構,這主要是利用XSLT來實現——XSLT處理器首先要做的是透過XML解析器(比如DOM或SAX)技術讀取XML格式文件中的各個標籤和資料,並將XML樹狀結構重新整理和組合產生出一個臨時的樹狀結構,這個樹狀結構稱為XML文件結果樹。
其次,再對轉換後的DOM樹進行格式化並轉換為其它的目標形式,這主要是利用XSL-FO來實現。XSL處理程式將這些資料轉換(也就是格式化過程)為另一種格式良好的XML檔案(如:WML、HTML、VoiceXML等)。
目前在微軟IE瀏覽器中已經內嵌有實現這個轉換過程的XML處理器程式。歡迎讀者繼續閱讀作者的另一篇文章《軟體專案實訓及課程設計指導--應用XML+XSLT技術分離Web表示層資料和樣式示例》可以詳細學習和了解如何在軟體應用系統開發中應用XML+XSLT技術。
7、應用XSLT實現對XML格式文件中的資料轉換和合並的應用示例
為了能夠讓讀者對"XML+XSLT"技術在企業級軟體應用系統開發中的應用有感性的認識,作者在下文中給出一個典型示例加以說明。
在下面示例中的XML格式文件中的"學生資訊"節點中有多個"班級"節點,可以透過XSLT中的<xsl:for-each>標籤把這些節點資料在一個表格單元格中顯示出來,從而產生出合併資料的應用效果。當然,也可以實現其它的應用效果,讀者可以自行實現。
(1)示例中所對應的XML格式文件
該XML文件檔名稱為student.xml,其中在<?xml-stylesheet?>標籤中透過href屬性指定對應的XSLT檔案,該檔名稱為student.xsl。
在student.xsl 檔案中應用了XSL語言中的一些標籤,而XSLT檔案中的標籤語法大致可分為如下的三種類型:
1)選擇模式,如<xsl:for-each>、<xsl:value-of>和 <xsl:apply-templates>等標籤,這些選擇模式的標籤語句將資料從XML文件中提取出來,是一種簡單獲得資料的方法。在這些標籤中都有一個select屬性,選取XML文件中特定的節點名的資料。
2)測試(識別)模式,如<xsl:if> 和<xsl:when>等標籤,類似於程式語言中的條件語句,主要是用於條件判斷和識別等用途。
3)匹配模式,如<xsl:template>標籤,它用於構建和定義一個模板。該標籤中的match 屬性主要是用於關聯 XML文件中的標籤元素和轉換模板,但match 屬性的值是 XPath (XML Path Language,XML路徑語言)表示式(比如match="/" 則是定義整個XML格式文件);位於<xsl:template> 標籤元素內部的內容則定義了寫到輸出結果的 HTML標籤程式碼。
<?xml version="1.0" encoding="gb2312" ?><xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <head> <title>XX交通大學軟體學院學生資訊</title> </head> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="軟體學院學生資訊"> <h3>下面為XX交通大學軟體學院學生資訊表</h3> <table border="1"> <th>姓名</th> <th>性別</th> <th>出生日期</th> <th>專業</th> <th>班級</th> <th>專業方向</th> <xsl:apply-templates/> </table> </xsl:template> <xsl:template match="學生資訊"> <tr> <td><xsl:value-of select="姓名"/></td> <td><xsl:value-of select="@性別"/></td> <td><xsl:value-of select="出生日期"/></td> <td><xsl:value-of select="專業"/></td> <td> <xsl:for-each select="班級"> <xsl:value-of /> </xsl:for-each> </td> <xsl:apply-templates/> </tr> </xsl:template> <xsl:template match="班級"> <td><xsl:value-of select="@方向"/></td> </xsl:template></xsl:stylesheet>
在student.xsl 檔案中應用了<xsl:apply-templates> 標籤元素產生模板巢狀的應用效果,因為<xsl:apply-templates> 標籤元素可把一個模板應用於當前的標籤元素或者當前標籤元素的子節點中。
如果向 <xsl:apply-templates> 標籤元素新增一個 select 屬性,則此標籤元素就會僅僅處理與由其select 屬性所定義的XML標籤中屬性值相匹配的XML標籤元素,從而可以過濾XML標籤。
(3)本示例在Web瀏覽器中最終執行的結果