You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:43:11