【发布时间】:2019-05-19 14:30:43
【问题描述】:
我正在尝试读取 XML 格式的消息并以 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>
下面是我的 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究竟做了什么?您是否有机会将其检查内联到select="select="xalan:nodeset($messageData)/activeMessage/message[predicate-goes-here]"的谓词中?一般来说,整个任务似乎可以通过匹配message的模板更好地解决,然后使用适当的apply-templates,然后您只需使用position() >签入匹配message的模板即可输出逗号作为分隔符。 -
当然,在 Xalan 的 Java 世界中,您可以轻松迁移到 Saxon 9 并拥有 XPath 3.1 的表现力和 JSON 支持。
-
您需要展示该模板的代码,以便任何人提出建议。正如我所说,如果您可以在您的选择表达式的谓词中内联该检查,您可以简化代码。
标签: xml xslt xslt-1.0 xslt-2.0