我有一个带有这样时间戳的 XML:
<node stamp="1236888746689" />
我想在结果 HTML 中将它们显示为日期和时间。有没有办法用 XSLT(任何版本)来做到这一点?
编辑: 我将 XSLT2.0 与 Saxon9 一起使用。基准日期是 1970-01-01 0:00。
您获取日期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>
如果您使用的是支持EXSLT 日期函数的 XSLT 1.0 处理器(我刚刚在 PHP 中使用libxsltdate:add()
进行了测试),您可以使用and 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 是使用 export_node 和 drush 从 Drupal 转储的几个节点。我在 PHP5 中使用 xslt 处理器,它只支持 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>
希望这可以帮助那里的人。当我解决这个问题时,我敲了很长时间。
如果您想使用不支持EXSLT 日期和时间函数的 XSL 1.0 处理器,这并非易事,但已经完成。
您可以查看Katy Coe 的“iso-from-unix”函数的 XSLT 1.0 实现。这是她创建的一组相当庞大的“免费用于非商业用途”的日期和时间函数的一部分。
但是,您的 XSL 处理器必须支持"http://exslt.org/functions"
命名空间才能使此实现工作。除此之外,不依赖于 EXSLT。
PS:我知道 Unix 时间戳和刻度并不完全相同。不过,它们已经足够近了。
XSLT 是图灵完备的,所以一定有办法。:) 至少了解一点 XSLT,它可能会涉及递归。
您没有指定“滴答声”的确切解释,我猜自某个时代以来的毫秒数,但是哪个?1970 年?