XSLT отображает данные, используя строковую дату - PullRequest
0 голосов
/ 09 ноября 2010

Добрый день всем,

У меня есть следующие данные XML:

<?xml version="1.0" encoding="utf-8" ?>
<Publicity>
    <pub display="left" type="image" url="http://www.link.to.website" alt="Lorem ipsum" startDate="2010-09-01" endDate="2011-09-01">http://link.to.image/banner.gif</pub>
    <pub display="left" type="image" url="http://www.link.to.website" alt="Lorem ipsum" startDate="2010-09-01" endDate="2011-09-01">http://link.to.image/banner.gif</pub>
    <pub display="left" type="image" url="http://www.link.to.website" alt="Lorem ipsum" startDate="2010-09-01" endDate="2011-09-01">http://link.to.image/banner.gif</pub>
    <pub display="left" type="image" url="http://www.link.to.website" alt="Lorem ipsum" startDate="2010-09-01" endDate="2011-09-01">http://link.to.image/banner.gif</pub>
    <pub display="left" type="image" url="http://www.link.to.website" alt="Lorem ipsum" startDate="2010-09-01" endDate="2011-09-01">http://link.to.image/banner.gif</pub>
</Publicity>

Я хотел бы отобразить только pub, которые действительны в соответствии со значением даты startDate и endDate, сопоставленной с текущей датой в XSLT 1.0.

Кстати, этот XML-файл находится в статическом файле и включен через функцию document(). Весь веб-сайт обрабатывается на стороне сервера с использованием функции PHP xsltProcessor().

Я надеюсь, что PHP в скором времени будет работать на собственном процессоре XSLT 2.0.

Любые советы будут оценены.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

Учитывая, что ваши startDate и endDate имеют формат «ГГГГ-мм-дд», вы можете просто удалить дефисы и выполнить числовое сравнение:

<xsl:variable name="numericCurrentDate"
              select="number(translate($currentDate, '-', ''))"/>
<xsl:if test="$numericCurrentDate >= number(translate(startDate, '-', '')) and
              number(translate(endDate, '-', '')) >= $numericCurrentDate">...

(Благодаря http://www.dpawson.co.uk/xsl/sect2/N7218.html)

Обратите внимание, translate(string, 'abcde...', '') возвращает копию строки аргумента с удаленными вхождениями символов 'abcde ...'.

В качестве альтернативы , вы можете использовать функции расширения. PHP XSLT (использующий libxslt) должен поддерживать такие расширения, как дата EXSLT: разница везде, где документы говорят, что они реализованы libxslt ... что они и делают в этом случае.

Функция date: разность возвращает продолжительность между первым свиданием и второе свидание. Если первое свидание происходит до второго свидания, затем результат - положительная продолжительность; если это происходит после второго свидания, результат - отрицательная продолжительность.

Таким образом, вы можете использовать:

<xsl:variable name="currentDate" select="date:date()" />
<xsl:for-each select="...">
    <xsl:if test="starts-with(date:difference($currentDate, startDate), '-') and
                  starts-with(date:difference(endDate, $currentDate), '-')">
       Do something with publication...

Обратите внимание, что EXSLT предоставляет нам как функцию для получения текущей даты, поэтому нам не нужно передавать ее в качестве параметра, так и способ сравнения двух дат.

Информацию о том, как использовать модуль даты в EXSLT, в том числе о том, как объявлять пространство имен, смотрите в EXSLT документах . Обратите внимание, что функции EXSLT поддерживаются не всеми процессорами XSLT, поэтому вам придется пожертвовать некоторой переносимостью.

1 голос
/ 09 ноября 2010

Лучше всего было бы передать текущую дату в как параметр .К сожалению, XSLT 1.0 не предоставляет никаких функций даты.

...