什么是 XSL?在什么情況下應(yīng)該使用它?
XSL 之于 XML 就像 CSS 之于 HTML。它是指可擴展樣式表語言 (EXtensible Stylesheet Language)。這是一種用于以可讀格式呈現(xiàn) XML 數(shù)據(jù)的語言。XSL 實際上包含兩個部分:
- XSLT – 用于轉(zhuǎn)換 XML 文檔的語言
- XPath – 用于在 XML 文檔中導(dǎo)航的語言
XSLT 是指 XSL 轉(zhuǎn)換 (XSL Transformation),它是 XSL 最重要的部分。
XSLT 可以將 XML 文檔轉(zhuǎn)換為其它 XML 文檔、XHTML 輸出或簡單的文本。這通常是通過將每個 XML 元素轉(zhuǎn)換為 HTML
元素來完成的。由于 XML 標簽是用戶定義的,瀏覽器不知道如何解釋或呈現(xiàn)每個標簽,因此必須使用 XSL。XML
標簽的意義是為了方便用戶(而不是計算機)理解。
XSLT 還可以對 XML 樹進行下列操作:
- 添加和刪除元素
- 添加和刪除屬性
- 對元素進行重新排列或排序
- 隱藏或顯示某些元素
- 查找或選擇特定元素
XSL 是否與 XML 相同?
既是又不是。說是,是因為它們遵循相同的語法規(guī)則(只有少許差異,下面我將會講到)。說不是,是因為它們的用途不同:XML 用于承載數(shù)據(jù),而
XSL 則用于設(shè)置數(shù)據(jù)的格式。XSL 聲明與 XML 聲明的不同之處在于,XML 聲明只寫一行,而且沒有結(jié)束標簽,而 XSL
聲明必須包含結(jié)束標簽。
在什么情況下應(yīng)該使用 XSL?
XSL 在設(shè)計時有幾個目標用途,這些用途使它成為某些開發(fā)情況下的完美解決方案,而對另一些開發(fā)情況則毫無用處。
- XSL 專門用于處理 XML 文檔,并且遵循 XML 語法。因此,它只能在支持 XML 的應(yīng)用程序中與 XML 結(jié)合使用。最合適使用
XML 和 XSL 的情況是:Web 門戶、新聞聚合器、社區(qū)網(wǎng)站或其它任何需要向各種設(shè)備及大量客戶端提供信息的 Web 應(yīng)用程序。
- XSLT
是一種基于模式匹配的語言。它會查找匹配特定條件的節(jié)點,然后應(yīng)用相應(yīng)的規(guī)則。因此,它不具備大多數(shù)編程語言的計算能力。例如,XSL
無法在運行時更改變量的值。它不應(yīng)該用于從使用復(fù)雜公式的動態(tài)數(shù)據(jù)源(例如在線商店)來計算值。Web 編程語言更適于此用途。
- XSL 不能代替或補充 CSS。它不應(yīng)(也不能)用于設(shè)置 HTML 的樣式。但是,您可以將其用于需要頻繁重新設(shè)計可視化效果、頻繁更換布局以及以靈活格式處理數(shù)據(jù)的網(wǎng)站。
- XSL 不是內(nèi)容管理工具。它不應(yīng)(也不能)用于更改 XML 文檔的內(nèi)容或者編輯信息。但是,您可以將 XML 和 XSL 用于需要處理幾種不同格式文檔的內(nèi)容管理系統(tǒng)。
服務(wù)器端與客戶端
服務(wù)器端轉(zhuǎn)換工作流程如下圖所示:
客戶端 XSL 轉(zhuǎn)換的工作流程:

什么是 XPath?
XSL 使用 XPath 來標識 XML 樹中需要處理的各個元素。
XPath 規(guī)范基本上遵循與文件系統(tǒng)尋址相同的規(guī)則:
- 如果 XPath 表達式以斜杠 (/) 開頭,代表的是 XML 元素的絕對路徑(從 XML 文檔的根開始)。
- 如果 XPath 表達式以雙斜杠 (//) 開頭,則會選擇當前文檔中符合指定條件的所有元素,而不考慮它們在 XML 文檔中的位置。例如,
//employee
會查找 XML 文檔中的所有員工節(jié)點。
- 星號 (*) 會選擇由前面的路徑定位的所有 XML 元素。例如,
/company/department/*
選擇一個部門的所有子節(jié)點,即該部門的所有員工。
- 點 (.) 選擇當前的節(jié)點,兩個點 (..) 選擇父節(jié)點。例如,用于選擇某個員工所在的部門的 XPath 表達式就是
../employee
。
- 要選擇屬性,請使用
@
字符。例如,/company/department/employee[@retired]
選擇指定了 retired
屬性的所有員工。
過濾項目
使用 <xsl:for-each>
構(gòu)造,您還可以根據(jù)條件過濾輸出。假設(shè)您只想顯示雇員中的程序員。
<xsl:template match="/">
<table border="1">
<tr>
<th>Name</th>
<th>Job</th>
<th>Salary</th>
</tr>
<xsl:for-each select="company/department/employee[job='Programmer']">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="job"/></td>
<td><xsl:value-of select="salary"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
要定義 XML 節(jié)點的條件,可以使用下列任何運算符:
- 等于 (=)
- 不等于 (!=)例如,name!='Ben Walker'
- 小于 (<)例如,salary<2750
- 小于或等于 (<=)
- 大于 (>)
- 大于或等于 (>=)
對項目進行排序
可以將項目按字母順序排列。只需使用 <xsl:sort />
構(gòu)造,并指定按哪個節(jié)點進行排序。<xsl:sort />
元素必須嵌套在 <xsl:for-each>
元素中,以確保應(yīng)用程序可以循環(huán)通過所有的項目。使用下面的代碼可以按字母順序顯示員工:
<xsl:template match="/">
<table border="1">
<tr>
<th>Name</th>
<th>Job</th>
<th>Salary</th>
</tr>
<xsl:for-each select="company/department/employee">
<xsl:sort select="name" />
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="job"/></td>
<td><xsl:value-of select="salary"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
當然,您只需在 <xsl:sort />
元素中額外添加一個屬性,即可方便地在升序和降序排列順序之間切換:
<xsl:sort select="/name" order="descending"/>
單一條件和多個條件
在大多數(shù)語言中,XSL 還能夠根據(jù)條件顯示內(nèi)容。
單一條件是使用下面的語法定義的:
<xsl:if test="表達式">
</xsl:if>
要對多個項目運行條件測試,以便只顯示滿足該條件的項目,需要將 xsl:if
構(gòu)造嵌套在 xsl:for-each
元素中。下面的示例顯示了如何只列出薪金高于 2700 元的員工:
<xsl:template match="/">
<table border="1">
<tr>
<th>Name</th>
<th>Job</th>
<th>Salary</th>
</tr>
<xsl:for-each select="company/department/employee">
<xsl:if test="salary > 2700">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="job"/></td>
<td><xsl:value-of select="salary"/></td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</xsl:template>
請注意,小于 (<) 和大于 (>) 符號由它們相應(yīng)的 HTML 轉(zhuǎn)義序列(< 和 >)代替。否則,它們很容易與標簽的開頭和結(jié)尾混淆。
在測試表達式中可以使用常用的條件運算符:
- <(小于)
- >(大于)
- =(等于)
- !=(不等于)
如果需要將某個值與某個字符串進行比較,則要將字符串放在單引號中(例如 <xsl:if test="job = 'Software Analyst'">
)。
象大多數(shù)編程語言中的 IF-ELSE 構(gòu)造一樣,您還可以定義更復(fù)雜的條件。所使用的語法一看就能明白:
<xsl:choose>
<xsl:when test="表達式">
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
為了在多個 XML 節(jié)點上測試條件,<xsl:choose>
構(gòu)造必須嵌套在 <xsl:for-each>
循環(huán)中。
假設(shè)您要以綠色高亮顯示薪金低于 2700 元的所有員工,以藍色高亮顯示薪金高于 2700 元的所有員工:
<xsl:template match="/">
<table border="1">
<tr>
<th>Name</th>
<th>Job</th>
<th>Salary</th>
</tr>
<xsl:for-each select="company/department/employee">
<xsl:choose>
<xsl:when test="salary > 2700">
<tr bgcolor="#66CCFF">
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="job"/></td>
<td><xsl:value-of select="salary"/></td>
</tr>
</xsl:when>
<xsl:otherwise>
<tr bgcolor="#00CC99">
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="job"/></td>
<td><xsl:value-of select="salary"/></td>
</tr>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</table>
</xsl:template>
<xsl:otherwise>
元素指定的是當 XML 節(jié)點不滿足初始測試條件時默認應(yīng)用的規(guī)則。