Полезные решения, шпаргалки и примеры по html, css, js, jQuery, MySQL, PHP, HostCMS, ssh.
В XSL шаблон к xsl:stylesheet добавляем новые атрибуты xmlns:date="http://exslt.org/dates-and-times" и extension-element-prefixes="date", должно получится:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:hostcms="http://www.hostcms.ru/"
exclude-result-prefixes="hostcms"
xmlns:date="http://exslt.org/dates-and-times" extension-element-prefixes="date">
Далее например можно записать в переменную текущую дату и вычислить разницу с другой датой с помощью date:difference(string, string).
Функция возвращает время между первой датой и второй. Если первая дата раньше чем вторая дата, то результат вернется положительным; если наоборот, результат вернется отрицательным.
<xsl:variable name="current_date">2015-11-11</xsl:variable>
<xsl:value-of select="date:difference($current_date,'2015-11-29')"/>
На выходе мы получим количество дней в формате P18D, т.е. продолжительность длиной 18 суток.
Обрезаем ненужные данные:
<xsl:variable name="difference_date" select="date:difference($current_date,'2015-11-29')" />
<xsl:value-of select="substring-before(substring-after($difference_date, 'P'), 'D')"/>
Если вдруг нам нужно прибавить к текущей дате несколько дней (например 5), делаем это с помощью функции date:add(string, string).
Первый аргумент должен быть датой, второй аргумент должен быть в формате ISO 8601, в нашем случае например P5D (5 дней).
<xsl:variable name="current_date">2015-11-11</xsl:variable>
<xsl:value-of select="date:add($current_date,'P5D')"/>
На выходе поулучим 2015-11-16.
С данной фунцией мы может получить в цикле календарь на 7 дней вперед:
<xsl:call-template name="days">
<xsl:with-param name="total_day" select="number(7)"/>
</xsl:call-template>
<xsl:template name="days">
<xsl:param name="i" select="0"/>
<xsl:param name="total_day"/>
<xsl:if test="$total_day > $i">
<xsl:variable name="duration" select="concat('P',$i,'D')"/>
<xsl:variable name="date" select="date:add('2015-11-11',$duration)"/>
<xsl:value-of select="$date"/><xsl:text> </xsl:text>
<xsl:call-template name="days">
<xsl:with-param name="i" select="$i + 1"/>
<xsl:with-param name="total_day" select="$total_day"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
На выходе: 2015-11-11 2015-11-12 2015-11-13 2015-11-14 2015-11-15 2015-11-16 2015-11-17
Рассмотрим еще одну функцию, которая определяет по дате день недели - date:day-in-week(string), всегда вовзращает целое числот от 1 до 7, где 1 - воскресенье.
<xsl:variable name="dayWeek" select="date:day-in-week('2015-11-11')" />
<xsl:choose>
<xsl:when test="$dayWeek = 1">воскресенье</xsl:when>
<xsl:when test="$dayWeek = 2">понедельник</xsl:when>
<xsl:when test="$dayWeek = 3">вторник</xsl:when>
<xsl:when test="$dayWeek = 4">среда</xsl:when>
<xsl:when test="$dayWeek = 5">четверг</xsl:when>
<xsl:when test="$dayWeek = 6">пятница</xsl:when>
<xsl:otherwise>суббота</xsl:otherwise>
</xsl:choose>
Все фунции и данные взяты из документации exslt.org. Там еще много разных функций для работы с датой и временем.