xsl:sort 是 XSLT 中控制输出顺序的核心元素,仅影响后续模板匹配或循环次序,不生成内容;必须嵌套在 <xsl:for-each> 或 <xsl:apply-templates> 内,select 为唯一必需属性,数字排序须显式设 data-type="number"。

xsl:sort 是 XSLT 中专用于控制输出顺序的核心元素,它本身不生成内容,只影响后续模板匹配或循环的执行次序。用对了,列表按价格、拼音、日期自然呈现;用错了,数字当字符串排(比如“10”排在“2”前面)、中文乱序、多条件失效——这些坑2025年仍高频出现。
必须放在哪儿?两种合法位置
它永远不能单独存在,只能作为子元素嵌套在以下两个地方之一:
- 在 <xsl:for-each> 内部:最直观,适合简单遍历+排序,比如“把所有 book 按 price 从高到低列出来”
- 在 <xsl:apply-templates> 内部:更符合 XSLT 的声明式风格,适合结构清晰、模板复用的场景,比如按章节顺序渲染文档
注意:不能放在 开头、不能放在
关键属性怎么选?避开三大默认陷阱
五个常用属性中,select 是唯一必需项,其余全可省略但极易踩坑:
-
select:必须写 XPath 表达式,如
price、@id、translate(title,'《》','')。别漏掉 @ 符号(属性要用 @) -
data-type:默认是
text。数字字段(price、year)务必显式写data-type="number",否则 "100" -
lang:中文排序必须加
lang="zh-CN",否则拼音乱序(比如“张”排在“阿”前面)。Saxon 引擎还支持collation增强写法 -
order:默认升序(
ascending),降序要主动写order="descending" -
case-order:中英文混排时,设
case-order="lower-first"可让 “apple” 排在 “Apple” 前面
多重排序怎么写?顺序即优先级
多个
- 先按作者中文名拼音升序 → 再按出版年份数字降序(新书优先):
<xsl:sort select="author" lang="zh-CN"/><xsl:sort select="year" data-type="number" order="descending"/> - 忽略书名号再按标题排序:
<xsl:sort select="translate(title,'《》','')" lang="zh-CN"/> - 销量字段含“5.2万”,需先清洗再转数字:
<xsl:sort select="number(translate(sales,'万人',''))" data-type="number" order="descending"/>
实用技巧与冷门但好用的写法
-
按字数排序:用
string-length(title),适合做视觉化展示 -
按属性排序章节:
<xsl:sort select="@order" data-type="number"/>,比用 position() 更可靠 -
随机排序:
<xsl:sort select="generate-id()"/>,每次转换结果不同,适合测试或轮播 -
日期文本也能倒序:只要格式统一为
2025-12-01,用data-type="text" order="descending"就等效于时间倒序
基本上就这些。不复杂但容易忽略细节,尤其是 data-type 和 lang —— 2025 年真实项目里,80% 的排序异常都出在这俩地方。










