XSLT中的xsl:sort是什么,如何对输出结果进行排序?

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

xsl:sort 是 XSLT 中用于对 节点集(node-set)进行排序 的指令,通常配合 xsl:for-eachxsl:apply-templates 使用,控制输出结果的排列顺序。

排序作用在哪个阶段?

它不改变原始 XML 数据结构,只影响当前模板匹配后、生成结果树时的处理顺序。也就是说:排序发生在“遍历前”,而不是“输出后”。比如你用 xsl:for-each select="book"xsl:sort 就决定这些 book 元素按什么顺序被逐个处理和输出。

基本用法和常用属性

放在 xsl:for-eachxsl:apply-templates 内部,作为子元素出现。关键属性包括:

  • select:指定排序依据的值,支持 XPath 表达式,如 select="title"select="@price"select="number(price)"
  • order:取值 ascending(默认)或 descending
  • data-type:指定比较类型,text(默认,字符串比较)、number(数值比较)、date(需格式规范,实际支持依赖处理器)
  • lang:影响字母排序规则,如 lang="zh" 可适配中文拼音序(非所有处理器都完整支持)

多级排序怎么写?

在一个 xsl:for-eachxsl:apply-templates 中可嵌入多个 xsl:sort,按先后顺序逐级生效。例如:


  
  
  
  

这表示:先按分类分组,同类中按价格升序,价格相同时再按书名字符串排序。

注意数值排序别踩坑

如果 price 是字符串形式(如 100),直接 select="price" 会按字典序排("20" > "100")。必须显式转为数值:

  • data-type="number"(简单但兼容性有限)
  • 更可靠写法:select="number(price)",配合 data-type="number" 或不设(XSLT 2.0+ 中 number() 返回数字类型,自动数值比较)

基本上就这些。排序逻辑清晰,但细节(比如类型处理、多级优先级、空值位置)容易忽略,写的时候盯住 select 表达式和 data-type 就不容易出错。