Как преобразовать Тики в читаемый 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?