xsl:sort 是 XSLT 中嵌套在 for-each 或 apply-templates 内用于节点排序的指令,支持按子元素、属性、表达式等多级排序,需指定 select、data-type 和 order 属性。

xsl:sort 是 XSLT 中用于对节点集(如 <xsl:for-each> 或 <xsl:apply-templates> 产生的结果)进行排序的核心指令。它不单独使用,必须嵌套在支持排序的指令内部。
基本用法:在 for-each 中排序
最常见场景是对一组同级元素按某个字段升序或降序排列。例如 XML 中有多个 <book>,想按出版年份排序:
<xsl:for-each select="library/book"> <xsl:sort select="year" data-type="number" order="ascending"/> <p><xsl:value-of select="title"/> (出版于 <xsl:value-of select="year"/>)</p> </xsl:for-each>
说明:
• select="year" 指定排序依据的子节点(也可用属性 @id、表达式 price * quantity 等)
• data-type="number" 告诉处理器按数值比较(默认是字符串)
• order="ascending" 表示升序(可选值为 ascending 或 descending)
多级排序:按主次条件依次排序
当第一排序字段相同时,可用多个 <xsl:sort> 实现“先按作者姓氏,再按书名”这类复合逻辑:
<xsl:for-each select="library/book"> <xsl:sort select="author/last-name" data-type="text" order="ascending"/> <xsl:sort select="title" data-type="text" order="ascending"/> <p><xsl:value-of select="title"/> / <xsl:value-of select="author/last-name"/></p> </xsl:for-each>
注意:XSLT 按 <xsl:sort> 出现顺序从上到下逐级应用,前面的优先级更高。
按属性或复杂表达式排序
排序依据不限于子元素,也可以是属性、函数结果或组合路径:
- 按 ID 属性:
<xsl:sort select="@id" data-type="number"/> - 按价格降序:
<xsl:sort select="price" data-type="number" order="descending"/> - 按标题长度(XSLT 1.0 需配合
string-length()):<xsl:sort select="string-length(title)" data-type="number"/> - 忽略大小写排序(XSLT 1.0 中常用
translate()):<xsl:sort select="translate(title, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')" data-type="text"/>
在 apply-templates 中排序(更推荐的结构化写法)
相比 for-each,用 apply-templates 更符合 XSLT 的声明式风格,排序逻辑同样有效:
<xsl:apply-templates select="library/book"> <xsl:sort select="year" data-type="number" order="descending"/> </xsl:apply-templates> <p><xsl:template match="book"> <p><xsl:value-of select="title"/> — <xsl:value-of select="year"/></p> </xsl:template>
关键点:<xsl:sort> 必须直接放在 <xsl:apply-templates> 开始标签和结束标签之间,且在 select 属性之后。










