Xsl模板應用基礎(一、介紹)


Xsl 的全稱是 eXtensible Stylesheet Language,它是專門用於以可讀格式呈現Xml數據的語言。它能把Xml數據轉換為任意形式的文本數據,如Html、Xml、Json、C#、Sql語句等。由於Xsl 是 Xml 語言的子集,因此 Xsl 的書寫格式也必須符合Xml的標准。它繼承了Xml語言的中立性,不偏向任何一種編程語言,各大編程語言也對Xsl有良好的支持。甚至可以這樣說,Xsl一次編寫,到處運行。

Xsl 目前最新版本是 2.0,但是2.0並沒有廣泛普及開來,.Net framework 還沒有找到Xsl 2.0的影子。得益於其強大的擴展能力,從過往幾年的使用過程中我感覺1.0版本也足夠使用。本系列的文章主要是在1.0的基礎上做演示與講述。

Xsl 的語法非常簡單,內置函數也很少,Visual Studio 與 Dreamweaver 也都有語法提示, 因此,對照教程敲一敲代碼大概半天時間就能上路應用Xsl了。下圖是Xsl應用時的流程圖:

各種編程語言都有自己的XML處理器,負責使用Xsl格式化Xml數據,得到最終結果。轉換過程還支持傳入兩種參數,既能傳入實體數據(文本、數字、Xml節點),還能傳入方法引用,比如把C#的方法傳入,供Xsl語言調用,這在后面的文章會有提及。

下面建立student.xml與student.xsl兩個文件來做展示。

student.xml:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <?xml-stylesheet type="text/xsl" href="student.xsl"?>
 3 <root>
 4     <student id="1000">
 5         <name>張三</name>
 6         <sex>male</sex>
 7         <age>16</age>
 8     </student>
 9     <student id="1001">
10         <name>李四</name>
11         <sex>female</sex>
12         <age>15</age>
13     </student>
14     <student id="1002">
15         <name>趙五</name>
16         <sex>male</sex>
17         <age>16</age>
18     </student>
19 </root>

student.xsl:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!DOCTYPE xsl:stylesheet  [
 3     <!ENTITY nbsp   "&#160;">
 4     <!ENTITY copy   "&#169;">
 5     <!ENTITY reg    "&#174;">
 6     <!ENTITY trade  "&#8482;">
 7     <!ENTITY mdash  "&#8212;">
 8     <!ENTITY ldquo  "&#8220;">
 9     <!ENTITY rdquo  "&#8221;"> 
10     <!ENTITY pound  "&#163;">
11     <!ENTITY yen    "&#165;">
12     <!ENTITY euro   "&#8364;">
13 ]>
14 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:js="http://www.example.com/results" extension-element-prefixes="js msxsl">
15 <xsl:output method="html" encoding="utf-8"/>
16 <msxsl:script language="javascript" implements-prefix="js"> 
17 <![CDATA[
18 function random(){
19     return Math.random();
20 }
21 ]]>
22 </msxsl:script>
23 
24 <xsl:template match="/">
25 <xsl:text disable-output-escaping='yes'>&lt;!DOCTYPE html&gt;</xsl:text>
26 <html>
27     <head>
28         <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
29         <title>學生清單</title>
30         <script>
31             function random(){
32                 return Math.random();
33             }
34         </script>
35     </head>
36     <body>
37         <table border="1" cellpadding="5" cellspacing="0">
38             <tr>
39                 <th>ID</th>
40                 <th>姓名</th>
41                 <th>年齡</th>
42                 <th>性別</th>
43             </tr>
44             <xsl:for-each select="/root/student">
45                 <tr>
46                     <td>
47                         <xsl:value-of select="@id"/>
48                     </td>
49                     <td>
50                         <xsl:value-of select="name"/>
51                     </td>
52                     <td>
53                         <xsl:value-of select="age"/>
54                     </td>
55                     <td>
56                         <xsl:choose>
57                             <xsl:when test="sex='male'">
58                                 <xsl:value-of select="'男'"/>
59                             </xsl:when>
60                             <xsl:when test="sex='female'">
61                                 <xsl:value-of select="'女'"/>
62                             </xsl:when>
63                             <xsl:otherwise>
64                                 <xsl:value-of select="'未知'"/>
65                             </xsl:otherwise>
66                         </xsl:choose>
67                     </td>
68                 </tr>
69             </xsl:for-each>
70         </table>
71         
72         Html頁面腳本調用隨機數:
73         <script>
74             document.write(random());
75         </script>
76         <br/>
77         轉換過程調用隨機數:<xsl:value-of select="js:random()" />
78         <br/>
79     </body>
80 </html>
81 
82 </xsl:template>
83 </xsl:stylesheet>

先看student.xml,唯一特別之處是第二行,有一條處理指令,通知Xml處理器需要引入student.xsl。再看看xsl文件,滿眼Html標簽,僅有少數 <xsl:xxx> 之類的元素,這是xsl特有的標記,在xsl文件第14行,有xsl命名空間的出處:http://www.w3.org/1999/XSL/Transform,訪問該地址,能得到W3C對Xsl技術完整的定義描述。

把這兩個文件放到iis站點下,用瀏覽器訪問Xml文件的地址,如http://192.168.1.100/student.xml,得到下圖:

Xml 呈現出標准的Html界面,瀏覽器在此處充當了Xml處理器的角色,IE5.5+,Chrome、Firefox 都支持在客戶端解析Xsl語言。如果把student.xml作為頁面呈現的主數據(例如學生清單為主體),通過Xsl的document()函數載入同域下的其他Xml片段數據作為輔助數據(例如考試分數Top10、簡單報表為側邊欄內容),我們就可以得到數據豐富、表現復雜的頁面(印象中以前射手網就是采用這種方法)。這是一種數據與UI完全分離的網頁制作方法,適合團隊分工合作。

回頭再看看student.xsl模板文件,<xsl:for-each select="{XPath}"> 元素通過XPath路徑查詢語言遍歷Xml中的的student元素,並組織Html的結構。關於XPath,http://www.w3school.com.cn/xpath/ 能找到完整的介紹。Xsl中還聲明了擴展命名空間urn:schemas-microsoft-com:xslt,前綴(簡稱)為msxsl,該空間由微軟提供支持(就是IE Only),例子中該空間下定義了script元素,指定語言為javascript,由Xml處理器調用該語言的解析引擎實現。如果本案例不通過瀏覽器處理,而是通過C#提供的Xml處理器執行轉換,前面的script元素甚至可以指定語言為C#、vb.net。

script元素中包含一個 random() 隨機數方法,請注意它與第31行同名方法的區別,前者在生成HTML過程中執行,后者在HTML生成結束后執行。兩者由於運行環境不同,前者不能調用瀏覽器對象模型(BOM)

 

本文所舉例子(下載例子)旨在介紹Xsl,Xsl完整語法請閱讀W3C的教程。文章第一張圖是Xsl在實際應用中的流程圖,剛上手Xsl時,需緊記流程圖中環節,可少走彎路。從過往經驗來看,在瀏覽器端解析Xml數據比較少見,一般都采用后端C#/Java/Php執行轉換處理,最終輸出HTML字符串。因此本例中Xsl文件內部聲明擴展script的做法顯得有些另類,一般在后端轉換過程傳入方法引用供Xsl調用,本系列的后續文章將會專門講述Xsl的擴展方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM