我有一个带有以下时间戳的 XML:
<node stamp="1236888746689" />
我想把它们以日期加时间的形式显示在结果HTML中。 有没有用XSLT(任何版本)实现的方法?
编辑: 我正在使用带Saxon9的XSLT2.0。基础日期为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>
<xsl:value-of>
用 <xsl:attribute name="MyAttribute"></xsl:attribute>
包装起来。 - Kees C. Bakker如果您正在使用支持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()
进行格式化,具体取决于您的需求。虽然有点晚,但是我找不到我想要的答案,所以我想通过我的解决方案来回报大家。
我的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>
希望这能帮助到有需要的人。在解决这个问题时,我曾经苦思冥想了很长时间。
<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如果您想使用不支持EXSLT日期和时间函数的XSL 1.0处理器,则这是非常棘手的,但已经完成了。
您可以查看Katy Coe's XSLT 1.0实现的“iso-from-unix”函数。它是她创建的一个相当庞大的“免费供非商业使用”的日期和时间函数集合的一部分。
但是,您的XSL处理器必须支持 "http://exslt.org/functions"
命名空间才能使该实现正常工作。除此之外,没有依赖于EXSLT。
P.S .:我知道Unix时间戳和tick不完全相同。但它们足够接近。
XSLT是图灵完备的,所以一定有方法。 :) 如果你至少了解一点XSLT,它可能涉及递归。
您没有指定“ticks”的确切解释,我猜测是自某个时期以来的毫秒数,但是是哪个时期?1970年?