Как преобразовать Тики в читаемый datetime с помощью XSLT?
У меня есть XML с метками времени, как это:
<node stamp="1236888746689" />
и я хотел бы отобразить их в результате HTML как дату со временем. Есть ли способ сделать это с помощью XSLT (любая версия)?
EDIT: Я использую XSLT2.0 с Saxon9. Базовая дата 1970-01-01 0:00.
5 ответов
вы берете дату 1970-01-01T00:00:00
и добавьте столько миллисекунд, сколько скажет вам значение штампа:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.w3.org/TR/xhtml1/strict">
<xsl:template match="node">
<xsl:value-of
select='xs:dateTime("1970-01-01T00:00:00") + @stamp * xs:dayTimeDuration("PT0.001S")'/>
</xsl:template>
</xsl:stylesheet>
если вы используете процессор XSLT 1.0, который поддерживает функции даты EXSLT (Я только что протестировал это с libxslt в PHP), вы можете использовать date:add()
и date:duration()
:
<xsl:value-of select="date:add('1970-01-01T00:00:00Z', date:duration(@stamp div 1000))"/>
на date:duration()
функция занимает несколько секунд (поэтому вам нужно разделить миллисекунды на 1000) и превращает ее в " Длительность "(в этом случае"P14315DT20H12M26.6889998912811S
"), который затем добавляется к началу вашей эпохи (выглядит как стандарт эпоха, для этой марки) с date:add()
чтобы получить штамп"2009-03-12T20:12:26.6889998912811Z
". Затем вы можете отформатировать это с помощью функций даты EXSLT или просто substring()
в зависимости от того, что вам нужно.
запоздалый ответ, да, я знаю, но я не мог найти тот, который искал здесь, поэтому я подумал, что заплачу вперед своим решением.
мой XML был несколькими узлами, сброшенными из Drupal с помощью export_node и drush. Я использовал процессор xslt в PHP5, который поддерживает только xslt 1.0. Некоторые функции EXSLT, похоже, поддерживаются, но я не мог сказать, был ли мой синтаксис неправильным или функция, которую я пытался использовать, не поддерживалась. Во всяком случае, следующее сработало для меня. Я использовал пример кода из w3schools.com, но добавил строку сразу после объявления xsltprocessor, как показано ниже:
$xp = новый XsltProcessor ();
$xp - >registerPHPFunctions ();
PHP имеет тривиальную функцию для преобразования даты, поэтому я обманул и использовал процессор PHP, так как я уже использовал его для преобразования моего xsl.
<xsl:for-each select="node_export/node">
<xsl:value-of select="php:function('date', 'n-j-y', number(timestamp))"/>
</xsl:for-each>
надеюсь, это поможет кому-то там. Я довольно долго бился головой, пока обдумывал это.
Если вы хотите использовать процессор xsl 1.0, который не поддерживает EXSLT функции даты и времени это нетривиально, но это было сделано.
вы можете посмотреть на реализация XSLT 1.0 Кэти Коу функции "iso-from-unix". Это часть довольно огромного" бесплатного для некоммерческого использования " набора функций даты и времени, которые она создала.
однако ваш процессор XSL должен поддерживать "http://exslt.org/functions"
пространство имен для этого реализация к работе. Кроме этого, нет никакой зависимости от EXSLT.
П. С.: Я знаю, что в unix timestamp и клещей не ровно то же самое. Но они достаточно близко.
XSLT-это Turing complete, Так что должен быть способ. :) Зная, по крайней мере, немного XSLT, это, вероятно, будет включать рекурсию.
вы не указываете точную интерпретацию ваших "тиков", я предполагаю миллисекунды с какой-то эпохи, но которая? 1970?