XML可擴充樣式單語言
XSL是一種語言,通過對XML文檔進行轉換,然後將轉換的結果表現出來。轉換的過程是根據XML文檔特性運用XSLT(XML Transformations)將XML文檔轉換為樹形結構(結果樹),這棵樹是帶有樣式資訊的。再按照FO(Formatted object)分析結果樹,將XML文檔表現出來。
XSL表現XML文檔的兩個步驟,建樹和表現樹。其中,建樹可以在伺服器端執行,也可以在用戶端執行。在伺服器端執行時,在伺服器端轉換產生HTML文檔,然後傳給用戶端瀏覽。如果在用戶端執行則需要用戶端支援XML和XSL,因為從伺服器端傳來的是XML和XSL文檔,這些文檔在客戶解析執行。
下面是一個完整的使用XSL樣式單的例子。通過這個例子,為大家介紹XSLT的轉換方法和XSLT的書寫格式。
程式清單3-8:example-3-7.xml
<?xml version="1.0" encoding="gb2312"?>
<?xml-stylesheet type="text/xsl" href="example-3-8.xsl"?>
<檔案>
<學生 性別="0">
<姓名>張三</姓名>
<ID>001</ID>
<年齡>16</年齡>
<電話>12345678</電話>
</學生>
<學生 性別="1">
<姓名>李四</姓名>
<ID>002</ID>
<年齡>20</年齡>
<電話>23456789</電話>
</學生>
<學生 性別="0">
<姓名>王五</姓名>
<ID>003</ID>
<年齡>19</年齡>
<電話>34567890</電話>
</學生>
</檔案>
程式清單3-9:example-3-8.xsl
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template><xsl:apply-templates/></xsl:template>
<xsl:template match="檔案">
<html>
<head>
<title>學生檔案示範</title>
</head>
<body>
<table border="2" title="這是一個學生檔案示範." align="center">
<caption>學生檔案示範</caption>
<tr bgcolor="yellow">
<th>姓名</th>
<th>學號</th>
<th>年齡</th>
<th>聯絡電話</th>
</tr>
<xsl:for-each select="學生">
<tr>
<td><xsl:value-of select="姓名"/></td>
<td><xsl:value-of select="ID"/></td>
<td><xsl:value-of select="年齡"/></td>
<td><xsl:value-of select="電話"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
example-3-7.xml是一個XML文檔,我們用XSL樣式單example-3-8.xsl來表現這個XML文檔。
XSL文檔本身也是XML文檔,所以第一行和XML文檔一樣,是文檔聲明。第二行聲明了本XSL樣式單的名稱空間。
第四行指明應用模板函數。第5-31行是模板函數的定義。第5行說明了模板要匹配的節點。
XSL還提供一種類似於函數調用的方法去匹配模板。其形式為:
……
<xsl:apply-templates select="A"/>匹配參數為A的模板
……
<xsl:template match="A">參數為A的模板定義
……
</xsl:template>標記的匹配
通過上面的例子,我們可以知道XSLT實際上是通過模板(template)將來源文件按照模板的格式轉換為結果文檔的。模板定義了一系列的元素來描述來源文件中的資料和屬性等內容,在經過轉換之後,建立樹形結構(帶資訊的結果樹)。
在樣本中,我們使用了迴圈來匹配模板:
<xsl:for-each select="學生">
<tr>
<td><xsl:value-of select="姓名"></td>
<td><xsl:value-of select="ID"></td>
<td><xsl:value-of select="年齡"></td>
<td><xsl:value-of select="電話"></td>
</tr>
</xsl:for-each>
這是一種類似於函數的調用的匹配方式。"xsl:for-each"元素迴圈調用"xsl:value-of"元素來匹配不同的標記,直至將所有的"學生"標記都匹配一遍後,才結束迴圈。