一、<xsl:choose>多分支條件
語法結構(類似 if … else if … else)
<xsl:choose>
<xsl:when test="條件運算式">
條件成立時輸出內容
</xsl:when>
<xsl:when test="條件運算式2">
條件2成立時輸出內容
</xsl:when>
<xsl:otherwise>
所有when條件皆不滿足時輸出(可選)
</xsl:otherwise>
</xsl:choose>Code language: HTML, XML (xml)
- 由上往下比對,匹配到第一個符合的
<xsl:when>就會停止執行; <xsl:otherwise>只能放在全部<xsl:when>的後面;- 運算式內
>要寫成>,<要寫成<。
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head></head>
<body>
<ul>
<!-- 遍歷所有學生 -->
<xsl:for-each select="class/student">
<!-- 依照年齡升序排序 -->
<xsl:sort select="age"/>
<!-- 篩選身高大於160的學生 -->
<xsl:if test="height > 160">
<li>
<xsl:value-of select="name"/>;
<!-- 多重判斷:身高>200時年齡加粗顯示 -->
<xsl:choose>
<xsl:when test="height > 200">
<b><xsl:value-of select="age"/></b>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="age"/>
</xsl:otherwise>
</xsl:choose>
</li>
</xsl:if>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>Code language: HTML, XML (xml)
執行邏輯:遍歷→依照年齡排序→篩選身高>160→身高超過200則年齡加粗顯示。
二、瀏覽器端XSLT轉換方案
並非所有瀏覽器都支援XSLT,可以透過下面的方式處理。現在大多數人使用Chrome、Firefox,這個問題已經很少見,但建議讀者有所認識。
1:JavaScript 用戶端轉換(舊版IE方案)
原理:頁面載入JS,讀取XML檔案與XSL樣式表,在瀏覽器內完成轉換並輸出HTML。
// 載入XML
var xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.load("cdcatalog.xml");
// 載入XSL
var xsl = new ActiveXObject("Microsoft.XMLDOM");
xsl.async = false;
xsl.load("cdcatalog.xsl");
// 轉換輸出
document.write(xml.transformNode(xsl));Code language: JavaScript (javascript)
ActiveXObject僅舊版IE瀏覽器支援,現代Chrome、Firefox無法相容;- 仰賴瀏覽器內建XML解析器,相容性不佳。
2:伺服器端轉換
核心思路:不要在瀏覽器執行轉換
目前多數專案採用此方式,在伺服器端完成轉換,就不會有瀏覽器相容問題,多數企業實務也是這樣做。
- 後端(Java/PHP/.NET等)使用XSLT引擎,將XML + XSL預先轉換成XHTML;
- 直接把產生好的HTML頁面回傳給瀏覽器;
- 優點:相容全部瀏覽器,用戶端瀏覽器不需要支援XSLT。
三、XPath 基礎觀念
XPath 是XML文件路徑查詢語言,是XSLT的核心基礎。
- 透過路徑運算式定位XML節點(概念類似檔案路徑);
- 具備內建標準函式庫,支援數值運算、字串處理;
- 屬於W3C官方標準;
- 所有寫在
select=""、test=""當中的運算式,都屬於XPath語法。
總結
| 標籤 | 適用場景 | 分支特性 |
|---|---|---|
<xsl:if> | 單一條件判斷 | 僅成立分支,沒有else |
<xsl:choose> | 多條件分支判斷 | 多組when + otherwise(對應else) |
多分支