14

我有一个带有这样时间戳的 XML:

<node stamp="1236888746689" />

我想在结果 HTML 中将它们显示为日期和时间。有没有办法用 XSLT(任何版本)来做到这一点?

编辑: 我将 XSLT2.0 与 Saxon9 一起使用。基准日期是 1970-01-01 0:00。

4

5 回答 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>
于 2009-03-13T14:31:02.333 回答
9

如果您使用的是支持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()根据您的需要格式化它。

于 2009-03-13T14:54:10.407 回答
4

迟到的答案,是的,我知道,但我在这里找不到我要找的那个,所以我想我会用我的解决方案来支付它。

我的 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>

希望这可以帮助那里的人。当我解决这个问题时,我敲了很长时间。

于 2011-03-02T23:33:07.257 回答
1

如果您想使用不支持EXSLT 日期和时间函数的 XSL 1.0 处理器,这并非易事,但已经完成。

您可以查看Katy Coe 的“iso-from-unix”函数的 XSLT 1.0 实现。这是她创建的一组相当庞大的“免费用于非商业用途”的日期和时间函数的一部分。

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

PS:我知道 Unix 时间戳和刻度并不完全相同。不过,它们已经足够近了。

于 2009-03-13T14:53:22.873 回答
0

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

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

于 2009-03-13T14:13:19.693 回答