Использование XSLT 1.0 и получение дат в следующем формате:
20111129060804
, и мне нужно иметь возможность рассчитывать различия между двумя из них.Однако Я не могу использовать расширения .
У меня также есть другие ограничения:
- Я ограничен в отношении пространств имен, которые могут использоваться внутри XSLT,
- и где я используюТаблица стилей xsl (стороннее приложение) не будет должным образом обрабатывать какие-либо действия включения / импорта в xsl.
Так что, по сути, xslt, который мне нужно использовать, должен быть в значительной степени самодостаточным,в том, что все, что вызывается или ссылается, должно быть в самом xslt.
Я подумал о том, чтобы взять дату и время, преобразовать их в юлианский серийный номер и обработать математику даты так же, как это делает Excel.Пример -
09/14/2011 08:19:37 = 40800.346956018500000
09/15/2011 12:22:46 = 40801.515810185200000
difference 1 day 4 hours 3 minutes and 9 seconds
difference = 1.168854166666280
, где все, что осталось от десятичного знака, находится в днях, а все, что находится справа от десятичного знака, - во времени (т. Е. 168854166666280 * 24 = 4,0524999999990680 или 4 часа и 0,0525 процента от часа,или 3,15 минуты).
Кто-нибудь когда-либо делал этот тип математики даты и времени в XSLT 1.0 без использования расширений?
Буду признателен за любые мысли, предложения или ссылки, если существует существующий набор кода, который я могу изменить.
РЕДАКТИРОВАТЬ -
Я решил продолжить с вышеизложенного, истолкнулся с проблемой преобразования времени.
Пример, который я использую: Время начала = 08:19:37 Время окончания = 15: 58: 33
, то есть продолжительность / разницаиз 7:38:56 (Кстати, это только для расчета в тот же день - у меня есть, чтобы выдать ошибку, если Конечное время <Время начала или если День>> 0).
Чтобы прибыть во время, я конвертирую все в секунды, а затем делаю математику.08:19:37 конвертируется в 29977 (8 * 3600 для часов + 19 * 60 для минут + секунд).15:58:33 преобразуется в 57513 (15 * 3600 для часов + 58 * 60 для минут + секунд).
Разница составляет 27536 секунд.
Я получаю: 27536/3600 = 7,6488888888888888888<- целая часть - часы, тогда разница составляет 27536 - 25200 = 2336 <- 25200 = 7 часов * 3600 секунд 2336/60 = 38,93333333333333333 <- целая часть составляет 38 минут, тогда разница 2336 - 2280 =56 секунд сверху.</p>
Однако, если я попытаюсь получить целую часть этих чисел, она будет округлена.
<xsl:template name="time-difference">
<xsl:param name="from-hour"/>
<xsl:param name="from-minute"/>
<xsl:param name="from-second"/>
<xsl:param name="to-hour"/>
<xsl:param name="to-minute"/>
<xsl:param name="to-second"/>
<xsl:variable name="f-secs" select="($from-hour * 3600) + ($from-minute * 60) + ($from-second)"/>
<xsl:variable name="t-secs" select="($to-hour * 3600) + ($to-minute * 60) + ($to- second)"/>
<xsl:variable name="sec-diff" select="$t-secs - $f-secs"/>
<xsl:variable name="daysec-diff" select="format-number(($sec-diff div 86400),'#')"/>
<xsl:variable name="q" select="($sec-diff div 3600)"/>
<xsl:variable name="t-hrs-diff" select="format-number(($sec-diff div 3600),'00')"/>
Переменная q, указанная выше, имеет значение 7.648888888888888888 (что правильно) однако, t-hrs-diff, как только происходит форматирование числа, теперь содержит «08», что делает мое время неправильным.
Я знаю, что любая другая попытка форматирования, чтобы получить целую часть числа, привела бы кв округлении.
За пределами substring-before & substring-after - что ( я думаю ) заставит меня преобразоватьприведите к числу перед использованием в следующем вычислении - есть ли ЛЮБОЙ другой способ получить неизмененную целую часть числа и не нужно выполнять преобразование из строки в число, чтобы использовать кусочки?