xslt:创建一个计划

时间:2014-09-23 14:10:23

标签: xslt xslt-2.0 schedule

有人能告诉我,如何使用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。我将使用的日期格式为YYYYMMDDDD/MM/YYYY,但我可能会调整其他任何日期格式。

有人知道怎么做吗?

非常感谢!

1 个答案:

答案 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>