如何使用XSLT将ticks转换为可读的日期时间?

14

我有一个带有以下时间戳的 XML:

<node stamp="1236888746689" />

我想把它们以日期加时间的形式显示在结果HTML中。 有没有用XSLT(任何版本)实现的方法?

编辑: 我正在使用带Saxon9的XSLT2.0。基础日期为1970-01-01 0:00。


从技术上讲,这是可能的,但效率低下且需要进一步的输入(例如零时间的定义)。我会将其批量处理到一个扩展程序中 - 你的平台是什么? - annakata
5个回答

20
你需要取出日期 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>

如何修改答案以使用节点中的内部文本,而不是其属性? - Broam
@Broam 将 <xsl:value-of><xsl:attribute name="MyAttribute"></xsl:attribute> 包装起来。 - Kees C. Bakker

10

如果您正在使用支持EXSLT日期函数的XSLT 1.0处理器(我刚刚在PHP中测试了libxslt),则可以使用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()进行格式化,具体取决于您的需求。

4

虽然有点晚,但是我找不到我想要的答案,所以我想通过我的解决方案来回报大家。

我的XML是用export_node和drush从Drupal中导出的几个节点。我使用的是PHP5中的xslt处理器,它只支持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>

希望这能帮助到有需要的人。在解决这个问题时,我曾经苦思冥想了很长时间。


1
我还发现我需要使用这个:<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" xsl:extension-element-prefixes="php"> - kenny

1

如果您想使用不支持EXSLT日期和时间函数的XSL 1.0处理器,则这是非常棘手的,但已经完成了。

您可以查看Katy Coe's XSLT 1.0实现的“iso-from-unix”函数。它是她创建的一个相当庞大的“免费供非商业使用”的日期和时间函数集合的一部分。

但是,您的XSL处理器必须支持 "http://exslt.org/functions"命名空间才能使该实现正常工作。除此之外,没有依赖于EXSLT。

P.S .:我知道Unix时间戳和tick不完全相同。但它们足够接近。


0

XSLT是图灵完备的,所以一定有方法。 :) 如果你至少了解一点XSLT,它可能涉及递归。

您没有指定“ticks”的确切解释,我猜测是自某个时期以来的毫秒数,但是是哪个时期?1970年?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接