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

如何用XSLT 1.0实现带时序逻辑的XML消息转JSON输出

我正在做一个需求:从带有时序调度的XML中读取消息,将符合显示时间条件的消息转换为JSON格式输出,同时要处理单条和多条消息的JSON结构差异。以下是我的场景细节和实现代码:

需求概述

提取XML中的消息内容,根据每条消息的起止日期时间判断当前是否应该显示该消息,仅输出符合条件的消息为JSON格式,并且区分单条、多条消息的JSON结构。

输入XML示例

<activeMessage>
  <message>
    <messageText>test message 1</messageText>
    <displayScheduleContainer>
      <startDate>17/05/2019</startDate>
      <startTimeHrs>12</startTimeHrs>
      <startTimeMins>00</startTimeMins>
      <noEndDate/>
      <endDate>17/05/2019</endDate>
      <endTimeHrs>23</endTimeHrs>
      <endTimeMins>59</endTimeMins>
    </displayScheduleContainer>
  </message>
</activeMessage>

我的XSL实现代码

<xsl:for-each select="xalan:nodeset($messageData)/activeMessage/message">
  <xsl:variable name="messageInDateTime">
    <xsl:call-template name="dateLessThanTemplate">
      <xsl:with-param name="startDateTime" select="concat(displayScheduleContainer/startDate, ' ', displayScheduleContainer/startTimeHrs, ':', displayScheduleContainer/startTimeMins)" />
      <xsl:with-param name="endDateTime" select="concat(displayScheduleContainer/endDate, ' ', displayScheduleContainer/endTimeHrs, ':', displayScheduleContainer/endTimeMins)" />
    </xsl:call-template>
  </xsl:variable>
  <xsl:if test="$messageInDateTime = 'true'">
    <xsl:choose>
      <xsl:when test="position()=1">
        <xsl:call-template name="singleMessageJSON" />
      </xsl:when>
      <xsl:otherwise>
        <xsl:call-template name="multiMessageJSON" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:if>
</xsl:for-each>

额外注意点

  • 依赖的dateLessThanTemplate要确保正确解析DD/MM/YYYY格式的日期,避免因日期格式识别错误导致的时序判断失误。
  • XML中的<noEndDate/>节点目前未做处理,若存在该节点,应该忽略endDate和endTime字段,仅判断当前时间是否晚于startDateTime。
  • 生成JSON时要注意语法正确性,比如多条消息间的逗号分隔、单条消息也要包裹在数组结构中,避免出现无效JSON。

内容的提问来源于stack exchange,提问作者user2628187

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:32:36