有人能告诉我,如何使用xslt创建一个日期列表,使用开始日期和结束日期以及计算周期的参数,所以......就像输入一样
<root>
<startdate>2014/01/01</startdate>
<enddate>2015/02/20</enddate>
<period>daily</period>
</root>
给我一个清单
<root>
<date>2014/01/01</date>
<date>2014/01/02</date>
...
<date>2014/02/20</date>
</root>
我的节点period
可以包含值
daily
weekly
fortnightly
monthly
所以最后3个会给我一些像
这样的列表<root>
<date>2014/01/01</date>
<date>2014/01/08</date>
...
<date>2015/02/18</date>
</root>
<root>
<date>2014/01/01</date>
<date>2014/01/15</date>
...
<date>2015/02/11</date>
</root>
<root>
<date>2014/01/01</date>
<date>2014/02/01</date>
...
<date>2015/02/01</date>
</root>
最后一个日期小于或等于enddate。我将使用的日期格式为YYYYMMDD
和DD/MM/YYYY
,但我可能会调整其他任何日期格式。
有人知道怎么做吗?
非常感谢!
答案 0 :(得分:3)
首先,如果您希望日期被识别,必须使用YYYY-MM-DD
格式。
现在,这是一种快速而肮脏的方式来实现所要求的结果:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/root">
<result>
<xsl:call-template name="enumerate-dates">
<xsl:with-param name="startdate" select="startdate"/>
<xsl:with-param name="enddate" select="enddate"/>
<xsl:with-param name="period" select="period"/>
</xsl:call-template>
</result>
</xsl:template>
<xsl:template name="enumerate-dates">
<xsl:param name="startdate" as="xs:date"/>
<xsl:param name="enddate" as="xs:date"/>
<xsl:param name="period"/>
<xsl:if test="$startdate le $enddate">
<date><xsl:value-of select="$startdate" /></date>
<xsl:call-template name="enumerate-dates">
<xsl:with-param name="startdate">
<xsl:choose>
<xsl:when test="$period='daily'">
<xsl:value-of select="$startdate + xs:dayTimeDuration('P1D')" />
</xsl:when>
<xsl:when test="$period='weekly'">
<xsl:value-of select="$startdate + xs:dayTimeDuration('P7D')" />
</xsl:when>
<xsl:when test="$period='fortnightly'">
<xsl:value-of select="$startdate + xs:dayTimeDuration('P14D')" />
</xsl:when>
<xsl:when test="$period='monthly'">
<xsl:value-of select="$startdate + xs:yearMonthDuration('P1M')" />
</xsl:when>
</xsl:choose>
</xsl:with-param>
<xsl:with-param name="enddate" select="$enddate"/>
<xsl:with-param name="period" select="$period"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
应用于输入的示例:
<root>
<startdate>2013-12-15</startdate>
<enddate>2014-03-08</enddate>
<period>fortnightly</period>
</root>
结果是:
<?xml version="1.0" encoding="utf-8"?>
<result>
<date>2013-12-15</date>
<date>2013-12-29</date>
<date>2014-01-12</date>
<date>2014-01-26</date>
<date>2014-02-09</date>
<date>2014-02-23</date>
</result>