使用xsl:sort、xsl:for-each实现XML两级排序:乐队+专辑按年份排序
修正后的完整XSLT代码
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsl:output method="xml" encoding="UTF-8" indent="yes"/> <xsl:template match="/bands"> <bands> <xsl:for-each select="band"> <xsl:sort select="@bandname" order="ascending" /> <band> <!-- 复制当前band的所有原有属性 --> <xsl:copy-of select="@*"/> <!-- 对album按year属性升序排序 --> <xsl:for-each select="album"> <xsl:sort select="@year" data-type="number" order="ascending"/> <xsl:copy-of select="."/> </xsl:for-each> </band> </xsl:for-each> </bands> </xsl:template> </xsl:stylesheet>
修改说明
- 原代码使用
xsl:copy-of直接复制整个band节点,无法调整内部album的顺序,因此改为手动构造band节点结构 - 新增
album遍历逻辑,添加排序规则,显式指定data-type="number"避免年份按字符串排序出现逻辑错误 - 手动补充根节点
bands,保证输出XML格式合法 - 如果
band节点下存在album之外的其他子节点,可在album遍历逻辑后添加<xsl:copy-of select="*[not(local-name()='album')]"保留原有内容
内容的提问来源于stack exchange,提问作者S_Layer
相关产品推荐
相关产品推荐

