如何用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
相关产品推荐
相关产品推荐

