Morozov&Pimnev blog

Полезные решения, шпаргалки и примеры по html, css, js, jQuery, MySQL, PHP, HostCMS, ssh.

Работа с датой и временем в XSL на примере шаблонов HostCMS v6

В 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. Там еще много разных функций для работы с датой и временем.

times, xsl, dates