Главная » XSLT » Вычисление последнего дня месяца

0

Задача

Зная месяц и год, вычислить последний день месяца.

Решение XSLT 1.0

<xsl:template name="ckbk:last-day-of-julian-month"> <xsl:param name="month"/> <xsl:param name="year"/> <xsl:choose>

<xsl:when test="$month = 2 and not($year mod 4) and

($year mod 100 or not($year mod 400))"> <xsl:value-of select="2 9"/> </xsl:when> <xsl:otherwise> <xsl:value-of

select="substring(‘312831303130313130313031′, 2 * $month – 1,2)"/>

</xsl:otherwise> </xsl:choose> </xsl:template>

XSLT 2.0

Можно преобразовать шаблон из рецепта для версии 1.0 в функцию или, вос­пользовавшись функциями для работы с датами, вычесть единицу из первого дня следующего месяца. Второе решение проще понять, но первое, вероятно, будет работать быстрее.

<xsl:function name="ckbk:last-day-of-month" as="xs:integer">

<xsl:param name="month" as="xs:integer"/> <xsl:param name="year" as="xs:integer"/>

<!– Первый день месяца в данном году –> <xsl:variable name="date"

select="xs:date(concat(xs:string($year),

,-,,format-number($month,’00,),,-01,))"/>

as="xs:date"/>

<xsl:variable name="m"

select="xdt:yearMonthDuration(‘P1M’)" as="xdt:yearMonthDuration"/>

<xsl:variable name="d"

select="xdt:dayTimeDuration(‘P1D’)" as="xdt:dayTimeDuration"/>

<xsl:sequence select="day-from-date(($date + $m) – $d)"/>

</xsl:function>

Обсуждение

Этой функцией можно воспользоваться для построения страниц календаря. Зная правила вычисления високосных лет, легко понять, как она работает. Код получен трансляцией с Lisp, где число дней в каждом месяце извлекалось из списка. Я решил для той же цели применить функцию substring. Возможно, вам больше нравится несколько элементов when. Можно также хранить данные о каждом меся­це, в частности, о количестве дней в нем, в XML-документе.

См. также

О способах хранения метаданных о календаре в XML-документе см. ре­цепт 4.5.

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии