我有一个带有这样的时间戳的XML:
<node stamp="1236888746689" />
我想在结果HTML中将它们显示为时间日期。 有没有办法用XSLT(任何版本)来做?
修改 我正在使用XSLT2.0和Saxon9。基准日期是1970-01-01 0:00。
答案 0 :(得分:17)
您选择日期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>
答案 1 :(得分:9)
如果您使用的是支持EXSLT date functions的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()
对其进行格式化,具体取决于您的需要。
答案 2 :(得分:4)
迟来的答案,是的,我知道,但我找不到我在这里寻找的那个,所以我想我会用我的解决方案支付它。
我的XML是使用export_node和drush从Drupal转储的一些节点。我在PHP5中使用xslt处理器,它只支持xslt 1.0。某些EXSLT函数似乎受支持,但我无法判断我的语法是否错误或者我试图使用的函数不受支持。无论如何,以下工作对我有用。我使用了w3schools.com的示例代码,但在声明xsltprocessor之后添加了一行,如下所示:
$ xp = new XsltProcessor();
$ XP-&GT; 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>
希望这有助于那里的人。当我把它拿出来的时候,我正在敲打我的脑袋已经有一段时间了。
答案 3 :(得分:1)
如果你想使用不支持EXSLT date and time functions的XSL 1.0处理器,这是非常重要的,但已经完成了。
您可以查看Katy Coe's XSLT 1.0 implementation of the "iso-from-unix" function。它是她创造的一套相当庞大的“非商业用途免费使用”日期和时间功能的一部分。
但是,您的XSL处理器必须支持"http://exslt.org/functions"
命名空间才能使此实现正常工作。除此之外,不依赖于EXSLT。
P.S。:我知道Unix时间戳和刻度不是完全相同的东西。但他们已经足够接近了。
答案 4 :(得分:0)
XSLT是Turing complete,所以必须有办法。 :)至少知道一点XSLT,它可能会涉及递归。
你没有指定你的“滴答声”的确切解释,我猜测自某个时代以来毫秒,但是哪个? 1970?