一、<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→身高超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) |