Как динамически генерировать даты начала месяца с текущей даты, начиная с 2018-10-01 года, используя XSLT? - PullRequest
0 голосов
/ 01 мая 2019

Я новичок в коде XSLT и мне нужна помощь экспертов. У меня есть требование динамически генерировать начало месяца с 2018-10-01 (ГГГГ-ММ-ДД) до начала месяца предыдущего месяца, т. Е. 2019-04-01 (текущий месяц - 1 мая). Таким образом, каждый месяц, когда мы запускаем этот XSLT-код, в фрагмент добавляется предыдущий месяц.

Я пытался использовать функцию ниже, также включал пространства имен, как показано ниже xmlns: xsl = "http://www.w3.org/1999/XSL/Transform" xmlns: xs =" http://www.w3.org/2001/XMLSchema" xmlns: functx = "http://www.functx.com" xmlns: fn =" http://www.w3.org/2005/xpath-functions".

Но он говорит "Не удается найти функцию с двумя аргументами с именем {http://www.functx.com}yearMonthDuration()". Я использую это с кислородным редактором XML.

Ожидаемый результат:

<?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>

1 Ответ

2 голосов
/ 02 мая 2019

Используя процессор 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...