軟體項目實訓及課程設計指導——如何應用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。
<?xml version="1.0" encoding="GB2312" standalone="yes" ?>
<?xml-stylesheet type="text/xsl" href="student.xsl"?>
<軟體學院學生信息>
<學生信息 性別="男">
<姓名>張三</姓名>
<出生日期>1987/10/18</出生日期>
<專業>軟體工程</專業>
<班級 方向="J2EE軟體開發">軟體1班</班級>
<班級>9教東201</班級>
</學生信息>
<學生信息 性別="女">
<姓名>李四</姓名>
<出生日期>1988/2/18</出生日期>
<專業>軟體工程</專業>
<班級 方向="數字媒體方向">軟體2班</班級>
<班級>9教東202</班級>
</學生信息>
</軟體學院學生信息>
(2)示例中的XML文檔所對應的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 表達式(比如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瀏覽器中最終執行的結果
課程設計指導—如何應用CSS+Div分離Web表示層數據處理和展現邏輯
如何應用策略設計模式的思想設計通用的資料庫連接類
如何應用觀察者設計模式重構系統中日誌處理功能實現的程序代碼
如何應用策略設計模式分離JDBC資料庫連接中的外部環境信息
如何正確地創建和銷毀軟體應用系統中JDBC資料庫連接對象實例