歡迎您光臨本站 註冊首頁

XML技術系列講座(3)XML的顯示——XSL樣式單(上)

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  作者: 北京郵電大學 張劍


一、XML文檔轉換原理
數據格式轉換的重要思想是要把XML文檔視為一種樹結構,轉換的過程就是從源樹生成結果樹的過程。XSL樣式單定義了源樹和結果樹中對應部分的轉換規則,每條規則中包含了一個模板,並對應著一種模式。模板定義了轉換的結果,而模式則規定了需要進行轉換的元素或屬性對象。
XML中引用XSL的語法格式如下:

如果在聲明部分引用了多個XSL樣式單,則只有第一個樣式單會生效,其餘的都會被忽略掉。
XSL的格式轉換功能在複雜的電子商務解決方案中大有用武之地。比如,A公司和B公司都是生產機器零件的廠家,在貨物清單中都包含了產品序列號以及質量等級評分。A公司的文件格式如下:


12980-235
200


而B公司的文件格式有所不同,相關信息都出現在元素的屬性中:



這樣,雖然兩個公司的產品完全一樣,但由於文檔格式的差異給雙方的貿易往來設置了障礙。而使用XSL樣式單可以輕鬆地把A公司的文檔轉換成B公司的格式,反之亦然。
二、XML文檔轉換步驟
XML文檔的轉換過程分為兩步:
● 首先是根據XML文檔構造源樹,然後根據XSL規則將源樹轉換為結果樹。目前,這種轉換協議已經日趨完善,並從XSL中獨立出來,成為W3C正式推薦的標準,稱為XSLT(XSL Transformations);
● 生成結果樹后,就可以對其進行解釋,產生一種適合顯示、列印或是播放的格式,這一步稱為格式化(Formatting)。
XSL處理器負責實現轉換過程。首先,XML文檔被解析成DOM樹存放在內存中,接著對文檔進行分析,每一個DOM樹中的節點都會與一個模式相比較,當二者匹配時,就會按照模板中定義的規則進行轉換,否則繼續往下匹配。如此循環,直至整個文檔處理完畢。
三、XSL文檔標準格式
XSL文檔的標準格式如下:

template rule i
output template

XSL文檔本身是格式良好的XML文檔,所以在書寫時要注意標籤的匹配問題。既是XSL的聲明語句,也是根元素,必須位於文件的首部。通常也要利用xmlns屬性指明XSL的名稱空間。樣式單中所有的模板規則都由標籤標明。模板規則可以說明處理的對象(元素/屬性)、處理的方式或是轉換的結果。此時,我們可以把該標籤類似地理解為編程語言中函數的概念。
四、XSL的語法結構
XSL的邏輯語法結構包括循環和條件判斷。這兩種結構使用戶能夠靈活地書寫轉換規則。循環判斷是通過元素實現的,它的可選屬性包括select和order-by。循環結構能夠遍歷整個結果集合,而不必針對每一條結果都單獨書寫轉換規則。它的標準語法格式為:

......

條件判斷結構分為if語句和Case語句兩種形式。if語句是簡單地對條件進行判斷,結果為真就執行條件內部的規則,因此可以把if條件與簡單的布爾表達式聯合使用。下面這個例子就是對薪水超過100萬元的職員輸出「Overpaid employee」信息:

Overpaid employee

Case語句是對多種情況的分支判斷。該語句包括三個元素。下面的例子是對薪水不足1萬元的職員輸出「No tax」,對超過5萬元的職員輸出「High tax rate」,對介於其間的職員輸出「Normal tax rate」信息:


No tax


High tax rate

Normal tax rate

五、XSL的模板規則
標籤內的文本內容描述了轉換結果的形式,稱為輸出模板。屬性match的取值把模板規則與指定的元素或屬性相比較,只有匹配的DOM節點才會被處理,其餘的節點將被忽略。整個過程中最先匹配的是樹的根節點,根節點用「/」表示:

output template for root element

然後匹配其他節點,此時,只要在引號中指明要處理的元素對象名稱即可。如果在引號中出現的是「*」,那麼表示該規則適用於所有的未單獨指定處理的元素節點。比如下例中的第二個模板就表示要處理除元素之外的所有節點:

output template

 

output template

此外,XSL中還可以使用路徑指示符來指定一些特殊位置的元素與模板相匹配。「//」代表任意深度位置,如用來匹配文檔中任何位置的元素;而如果是,則表明是匹配元素的後繼節點中所有元素。另外一個路徑指示符是「/」,表示直接的父子節點關係。將剛才例子中的「//」換為「/」,就意味著匹配的是元素子節點中的元素。
很顯然,某些樹節點在XSL中可能會對應多個模板,在這種情況下,只有最後一個對應模板會生效,前面的模板規則都會被XSL處理器忽略掉。




[火星人 ] XML技術系列講座(3)XML的顯示——XSL樣式單(上)已經有575次圍觀

http://coctec.com/docs/program/show-post-71973.html