如何通过XSLT按时间顺序重新排序XML中的Meeting Patterns?
解决XML课程时间按周一至周五排序的XSLT方案
核心问题是默认字符串排序无法遵循星期的逻辑顺序,必须给每个星期几映射对应的数字优先级,再按数字排序才能达到预期效果。
假设你的XML结构示例
<MeetingPatterns> <MeetingPattern> <Day>周三</Day> <Time>09:00-11:00</Time> <!-- 其他课程属性 --> </MeetingPattern> <MeetingPattern> <Day>周一</Day> <Time>08:00-10:00</Time> </MeetingPattern> <MeetingPattern> <Day>周五</Day> <Time>14:00-16:00</Time> </MeetingPattern> </MeetingPatterns>
针对中文星期的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- 处理MeetingPatterns节点,对课程元素按星期排序 --> <xsl:template match="MeetingPatterns"> <xsl:copy> <xsl:for-each select="MeetingPattern"> <!-- 给星期映射数字优先级:周一=1,周二=2...周五=5 --> <xsl:sort select=" normalize-space(Day) = '周一' then 1 else normalize-space(Day) = '周二' then 2 else normalize-space(Day) = '周三' then 3 else normalize-space(Day) = '周四' then 4 else normalize-space(Day) = '周五' then 5" data-type="number" order="ascending"/> <xsl:copy-of select="."/> </xsl:for-each> </xsl:copy> </xsl:template> <!-- 保留所有其他节点的原样输出 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
针对英文星期缩写的简化写法
如果你的<Day>值是Mon/Tue/Wed/Thu/Fri,可以用translate函数快速映射数字:
<xsl:sort select="translate(normalize-space(Day), 'MTWTF', '12345')" data-type="number"/>
关键注意事项
- 用
normalize-space()处理<Day>文本,避免因空格、换行导致匹配失败 - 确保
<Day>的文本内容和XSLT中的判断完全一致(比如不要混用“礼拜一”和“周一”) - 指定
data-type="number",让处理器按数字大小排序,而非字符串编码顺序
内容的提问来源于stack exchange,提问作者cf8104
相关产品推荐
相关产品推荐

