xsl:sort 排序发生在模板匹配后、生成结果树前的遍历阶段,不改变原始XML结构;它通过 select、order、data-type 等属性控制多级排序顺序,数值排序需用 number() 函数或 data-type="number" 避免字典序错误。

xsl:sort 是 XSLT 中用于对 节点集(node-set)进行排序 的指令,通常配合 xsl:for-each 或 xsl:apply-templates 使用,控制输出结果的排列顺序。
排序作用在哪个阶段?
它不改变原始 XML 数据结构,只影响当前模板匹配后、生成结果树时的处理顺序。也就是说:排序发生在“遍历前”,而不是“输出后”。比如你用 xsl:for-each select="book",xsl:sort 就决定这些 book 元素按什么顺序被逐个处理和输出。
基本用法和常用属性
放在 xsl:for-each 或 xsl:apply-templates 内部,作为子元素出现。关键属性包括:
-
select:指定排序依据的值,支持 XPath 表达式,如
select="title"、select="@price"、select="number(price)" -
order:取值
ascending(默认)或descending -
data-type:指定比较类型,
text(默认,字符串比较)、number(数值比较)、date(需格式规范,实际支持依赖处理器) -
lang:影响字母排序规则,如
lang="zh"可适配中文拼音序(非所有处理器都完整支持)
多级排序怎么写?
在一个 xsl:for-each 或 xsl:apply-templates 中可嵌入多个 xsl:sort,按先后顺序逐级生效。例如:
<xsl:for-each select="book"> <xsl:sort select="category" /> <xsl:sort select="price" data-type="number" order="ascending" /> <xsl:sort select="title" /> <div><xsl:value-of select="title"/></div> </xsl:for-each>
这表示:先按分类分组,同类中按价格升序,价格相同时再按书名字符串排序。
注意数值排序别踩坑
如果 price 是字符串形式(如 <price>100</price>),直接 select="price" 会按字典序排("20" > "100")。必须显式转为数值:
- 用
data-type="number"(简单但兼容性有限) - 更可靠写法:
select="number(price)",配合data-type="number"或不设(XSLT 2.0+ 中number()返回数字类型,自动数值比较)
基本上就这些。排序逻辑清晰,但细节(比如类型处理、多级优先级、空值位置)容易忽略,写的时候盯住 select 表达式和 data-type 就不容易出错。










