Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Вычислить разницу дат


Автор: EgoBrain 29.6.2017, 10:16
Как в XSLT можно вычислить разницу дат в днях между текущей датой и датой полученной из текста в формате "yyyy-mm-dd"?

Код

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
 <soapenv:Body>
<date>2017-06-29</date>
</soapenv:Body>
</soapenv:Envelope>

Автор: diadiavova 29.6.2017, 12:19
EgoBrain, вот здесь был подобный вопрос. Что до формата, то распарсить дату несложно, достаточно встроенных строковых функций.
http://forum.vingrad.ru/forum/topic-309563/kw-дата-время.html

Автор: EgoBrain 25.7.2017, 06:27
Цитата(diadiavova @ 29.6.2017,  20:19)
EgoBrain, вот здесь был подобный вопрос. Что до формата, то распарсить дату несложно, достаточно встроенных строковых функций.
http://forum.vingrad.ru/forum/topic-309563/kw-дата-время.html

Спасибо, но мой процессор даже в current-date не может (javax.xml.transform 1.7) или может быть я неправильно пишу код  smile 
В теме по ссылке сказано что можно решить javacript-ом, я не гнушаюсь любыми доступными способами, еще когда создавал тему пытался и так и сяк, с javascript тоже не вышло.
Моих наработок уже нет, можете на моём примере выше способ реализации продемонстрировать: вызов функции current-date() и вызов javascript?

Автор: diadiavova 25.7.2017, 07:49
EgoBrain,  какой ещё каррентдэйт? Последний пост посмотри, там по параметрам датв вычисляется юлианский день. Вычислишь его для интересующих тебя дат и останется только найти разность результатов.

Автор: EgoBrain 25.7.2017, 09:38
Цитата

EgoBrain,  какой ещё каррентдэйт?

Цитата(EgoBrain @ 29.6.2017,  18:16)
вычислить разницу дат в днях между текущей датой и датой полученной из текста в формате "yyyy-mm-dd"


Автор: diadiavova 25.7.2017, 10:45
EgoBrain, да так-то оно так, только вот когда ты, говоря о несуществующей функции(или что там это было) пишешь ее название, как будто она существует, то выглядит это странно.
Что касается текущей даты, то тут все очень просто (не в смысле решения, а в смысле ответа на вопрос smile ): если стандартами такая функция не предусмотрена и процессор ничего подобного не представляет, то как по мне, так вполне очевидно, что вычислить ее, применяя какую-то магию - вряд ли представляется возможным. Тут уж либо найди способ передать эти данные в преобразование (например через параметры), либо придумай костыль. Если параметры недоступны, то в качестве костыля можно использовать какой-нибудь сервис, содержащий дату. Я не знаю, что именно ты там мутишь, но если все делается на сайте, то просто сделай так, чтобы этот сайт по определенному адресу возвращал XML-документ с датой и подгружай его с помощью фукнции document. Если делается в файловой системе, то перед преобразованием сохраняй файл в определенное место и то же самое. Возможно можно придумать что-то более внятное, но все зависит от того, что именно ты делаешь и в каких условиях.
А что касается JavaScript, то там я имел в виду, что в тех случаях, когда результатом преобразования будет HTML, то скрипт можно включить в него и выполнить вычисления уже после преобразования.

Автор: EgoBrain 26.7.2017, 02:01
diadiavova, спасибо за развернутый ответ. Насчет JavaScript я натыкался на примеры непосредственного его использования в XSLT (не в итоговом документе).
Насчет моих вопросов и т.д. это всё вытекает из незнания основ и стандартов (XML, XSL и прочие смежные), я понимаю что прежде чем применять технологию её нужно изучить, но требуемые сроки решения задачи меньше чем срок изучения и реализации (для таких случаев в том числе и нужен форум).
В результате я пробовал разные способы записи шаблона: подключение пространтв имен, различные способы вызова функции (с префиксом и без) и получал разные ошибки, что меня весьма запутало. Как результат невнятная постановка впороса здесь и неполное описание ситуации.

О функции current-date() узнал из руководства https://www.w3schools.com/xml/xsl_functions.asp где сказано
Цитата

XSLT 2.0, XPath 2.0, and XQuery 1.0, share the same functions library.

The URI of the function namespace is: http://www.w3.org/2005/xpath-functions

Версия XSLT 2.0 была одобрена в качестве рекомендации 24 января 2007 года а используемый мной процессор входит в состав Java EE 1.7, которая вышла 28 июля 2011 года. По идеи он должен осуществлять поддержку XSLT 2.0, значит я что-то делаю не так, не правильно описываю шаблон, потому и попросил пример.

Цитата

то просто сделай так, чтобы этот сайт по определенному адресу возвращал XML-документ с датой и подгружай его с помощью фукнции document

Отличная идея я попробую. А можно получить из вне не целый документ а например значение?

Автор: diadiavova 26.7.2017, 13:25
Цитата(EgoBrain @  26.7.2017,  02:01 Найти цитируемый пост)
Насчет JavaScript я натыкался на примеры непосредственного его использования в XSLT (не в итоговом документе).

В стандарте ничего такого нет, но разные процессоры могут поддерживать скриптинг на разных языках, если используемый тобой процессор поддерживает скриптинг, то узнать об этом ты можешь в документации именно по этому процессору. Кроме того, если код включен непосредственно в XSLT, это еще не значит, что исполняться он будет в процессе преобразования, он может быть предназначен и для итогового документа.
Цитата(EgoBrain @  26.7.2017,  02:01 Найти цитируемый пост)
Версия XSLT 2.0 была одобрена в качестве рекомендации 24 января 2007 года а используемый мной процессор входит в состав Java EE 1.7, которая вышла 28 июля 2011 года. По идеи он должен осуществлять поддержку XSLT 2.0, значит я что-то делаю не так, не правильно описываю шаблон, потому и попросил пример.

Да стандарт-то, конечно, существует давно, вот только его практически никто не поддержал. Джависты, насколько я знаю, используют saxon, когда нужен XSLT2, или еще там есть вроде xalan называется. Из этого можно сделать вывод, что процессор включенный в стандартную библиотеку классов (насколько я понимаю речь именно о таком процессоре) - не поддерживает XSLT2.
Цитата(EgoBrain @  26.7.2017,  02:01 Найти цитируемый пост)
 А можно получить из вне не целый документ а например значение?

Я полагаю ты понимаешь как работает веб-сервер? Ну тогда как ты себе это представляешь? Просто создай небольшой сервис, который по запросу будет выдавать что тебе надо, например вот такой документ
Код

<?xml version="1.0"?><date>2017-07-26</date>
Но если даже документ будет содержать больше данных, то к нему можно применять выражения XPath типа document($url)//date/text()

Автор: EgoBrain 27.7.2017, 02:28
Решение с функцией document подошло, закрываю тему.
Дяде Вове отдельный респект.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)