一、<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相当) |
複数分岐