Используя процессор XSLT 2.0, следующая таблица стилей:
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="/">
<Year>
<xsl:call-template name="enumerate-dates"/>
</Year>
</xsl:template>
<xsl:template name="enumerate-dates">
<xsl:param name="startdate" as="xs:date" select="xs:date('2018-10-01')"/>
<xsl:if test="$startdate le current-date() - xs:yearMonthDuration('P1M')">
<Month>
<xsl:value-of select="$startdate" />
</Month>
<xsl:call-template name="enumerate-dates">
<xsl:with-param name="startdate" select="$startdate + xs:yearMonthDuration('P1M')" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
, примененный к любому вводу XML, вернет (в текущем месяце мая 2019 года):
Результат
<?xml version="1.0" encoding="utf-8"?>
<Year>
<Month>2018-10-01</Month>
<Month>2018-11-01</Month>
<Month>2018-12-01</Month>
<Month>2019-01-01</Month>
<Month>2019-02-01</Month>
<Month>2019-03-01</Month>
<Month>2019-04-01</Month>
</Year>
Демоверсия : https://xsltfiddle.liberty -development.net / 94rmq6w
Добавлено:
Если вы предпочитаете, вы можете использовать более короткую, но менее очевидную версию:
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="/">
<Year>
<!-- 12*2018 + 10 + 1 = 242257 -->
<xsl:for-each select="0 to 12*year-from-date(current-date()) + month-from-date(current-date()) - 24227">
<Month>
<xsl:value-of select="xs:date('2018-10-01') + xs:yearMonthDuration(concat('P', ., 'M'))" />
</Month>
</xsl:for-each>
</Year>
</xsl:template>
</xsl:stylesheet>
Демо : https://xsltfiddle.liberty -development.net / 94rmq6w / 1