Вы можете сделать это, используя рекурсивный шаблон. Это не лучшее решение, так как это подвержено переполнению стека или ошибкам памяти (если заданный вами интервал дат достаточно велик), но это может быть место для начала.
Первое, что вам нужно для приведенного ниже примера, - проверить способ сгенерированного значения и убедиться, что это действительная дата (для этого вы можете найти несколько примеров в Интернете: я просто использовал a sample from an open source project и импортировал файл в примере только для держите его короче).
Тогда идея состоит в том, чтобы сгенерировать даты, добавив день к предыдущему, а затем день к текущему и так далее. Если день переполняется, вы добавляете один из них в месяц и начинаете снова с 1-го дня. Если переполнение месяца вы делаете то же самое с годом и начинаете с месяца 1. Теоретически единственным, который никогда не переполняется, является год (но вы ограничите это с конечным значением интервала).
Вы создаете дату и подтверждаете ее. Если он действителен и не дошел до конца интервала, который вы пытаетесь сгенерировать другим, добавив к нему дни (это то, что происходит в блоке X).
Когда вы получаете недопустимое значение, тогда что-то переполняется. Это может быть только день или месяц (как я уже упоминал выше). Сначала я проверяю месяц (блок Y). Если это так, я начинаю с 1-го числа месяца 1, но на следующий год. Если это день, который переполнен (блок Z), я начинаю с первого дня следующего месяца.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="http://www.getsymphony.com/download/xslt-utilities/source-code/54294/"/>
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:variable name="startDate" select="'03302012'" /> <!-- MMddyyyy format -->
<xsl:variable name="endDate" select="'05302012'" /> <!-- MMddyyyy format -->
<xsl:template match="/">
<values>
<xsl:call-template name="GenerateList">
<xsl:with-param name="day" select="number(substring($startDate, 3, 2))" />
<xsl:with-param name="month" select="number(substring($startDate, 1, 2))" />
<xsl:with-param name="year" select="number(substring($startDate, 5))" />
</xsl:call-template>
</values>
</xsl:template>
<xsl:template name="GenerateList">
<xsl:param name="day" select="1" />
<xsl:param name="month" select="1" />
<xsl:param name="year" select="1" />
<!-- 1 = valid, 0 = invalid according to the imported file -->
<xsl:variable name="validationResult">
<xsl:call-template name="date-is-valid">
<xsl:with-param name="day" select="$day"/>
<xsl:with-param name="month" select="$month"/>
<xsl:with-param name="year" select="$year"/>
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="$validationResult = 0">
<xsl:choose>
<xsl:when test="$month > 12">
<!-- block Y -->
<xsl:call-template name="GenerateList">
<xsl:with-param name="day" select="1" />
<xsl:with-param name="month" select="1" />
<xsl:with-param name="year" select="$year + 1" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<!-- block Z -->
<xsl:call-template name="GenerateList">
<xsl:with-param name="day" select="1" />
<xsl:with-param name="month" select="$month + 1" />
<xsl:with-param name="year" select="$year" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<!-- block X -->
<!-- same MMddyyyy format as the interval values -->
<xsl:variable name="currentDate" select="concat(format-number($month, '00'), format-number($day, '00'), $year)" />
<value>
<xsl:value-of select="$currentDate" />
</value>
<xsl:if test="not($currentDate = $endDate)">
<xsl:call-template name="GenerateList">
<xsl:with-param name="day" select="$day + 1" />
<xsl:with-param name="month" select="$month" />
<xsl:with-param name="year" select="$year" />
</xsl:call-template>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
привет, Не забудьте принять ответ. –