Подтвердить что ты не робот

Как конвертировать тики в читаемое datetime с XSLT?

У меня есть XML с отметками времени:

<node stamp="1236888746689" />

И я бы хотел отобразить их в результате HTML как дату со временем. Есть ли способ сделать это с помощью XSLT (любая версия)?

EDIT: Я использую XSLT2.0 с Saxon9. Базовая дата - 1970-01-01 0:00.

4b9b3361

Ответ 1

Вы берете дату 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>

Ответ 2

Если вы используете процессор 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() в зависимости от того, что вам нужно.

Ответ 3

Покойный ответ, да, я знаю, но я не мог найти тот, который я искал здесь, поэтому я подумал, что заплачу ему за свое решение.

Мой XML был несколькими узлами, сбрасываемыми с Drupal с использованием export_node и drush. Я использовал xslt-процессор в PHP5, который поддерживает только xslt 1.0. Некоторые функции EXSLT, как представляется, поддерживаются, но я не мог сказать, был ли мой синтаксис неправильным или функция, которую я пыталась использовать, не была поддержана. Во всяком случае, для меня работали. Я использовал код примера из w3schools.com, но добавил строку сразу после объявления xsltprocessor, как показано ниже:

$xp = new 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>

Надеюсь, что это поможет кому-то. Я долго стучал головой, когда я работал над этим.

Ответ 4

Если вы хотите использовать процессор XSL 1.0, который не поддерживает функции даты и времени EXSLT, это нетривиально, но это было сделано.

Вы можете посмотреть Katy Coe XSLT 1.0 реализация функции iso-from-unix. Это часть довольно огромного "бесплатного для некоммерческого использования" набора функций даты и времени, которые она создала.

Однако ваш XSL-процессор должен поддерживать пространство имен "http://exslt.org/functions", чтобы эта реализация работала. Кроме того, нет никакой зависимости от EXSLT.

P.S.: Я знаю, что временная метка Unix и тики не совсем то же самое. Однако они достаточно близки.

Ответ 5

XSLT Turing завершен, так что должен быть способ.:) Зная хотя бы немного XSLT, это, вероятно, будет включать рекурсию.

Вы не указываете точную интерпретацию своих "тиков", я предполагаю миллисекунды с какой-то эпохи, но что? 1970?