如何计算xslt 1.0中的时差(持续时间)?

时间:2012-01-04 15:46:50

标签: xml xslt

我使用xlstproc将一些xml文件转换为另一个xml格式文件,在转换期间,我需要计算开始和结束字段之间的时差值(持续时间,以秒或分钟为单位:秒)。

... <start>2011-12-13 16:15:26</start> <end>2011-12-13 16:17:27</end> ...

我找到了一个模板语法,但未能使用它。

<xsl:call-template name="date:duration">
  <xsl:with-param name="seconds" select="number" />?
</xsl:call-template>

很感激有人可以给我一个提示如何实现我的目标。提前谢谢!

1 个答案:

答案 0 :(得分:6)

我为你完成了一些工作并找到了this date:duration function,你似乎正在尝试使用它。但是,date:duration会将持续时间格式化的字符串转换为秒数,而您希望找到两个日期时间字符串之间的差异(持续时间)。

您可能需要date:difference。 如果您阅读documentation for this function/template,您会发现有关参数的信息:

  

这两个日期必须都是右截断的日期/时间字符串   [XML Schema Part 2:Datatypes]中定义的格式。 ......允许的格式如下......

xs:dateTime (CCYY-MM-DDThh:mm:ss)
...

原文中有斜体: CCYY-MM-DDThh:mm:ss ,但T不是斜体。换句话说,时间字符串在日期和时间之间需要一个文字T,而你的空间有空格。

所以我建议修复:

<start>2011-12-13T16:15:26</start>
  <end>2011-12-13T16:17:27</end>

startend字符串作为参数传递给模板。您可以通过传递startend元素节点来完成此操作,这些节点将根据文本内容自动转换为字符串:

<xsl:variable name="time-diff-dur">
  <xsl:call-template name="date:difference">
    <xsl:with-param name="start" select="start" />
    <xsl:with-param name="end" select="end" />
  </xsl:call-template>
</xsl:variable>
<!-- The above returns a duration formatted string, so convert that to seconds: -->
<xsl:variable name="time-diff-sec">
  <xsl:call-template name="date:seconds">
    <xsl:with-param name="seconds" select="$time-diff-dur" />?
  </xsl:call-template>
</xsl:variable>

此代码假定上下文节点是<start><end>元素的父节点。在上面的代码之后,变量$time-diff-sec将包含一个结果树片段,如果需要,可以使用number($time-diff-sec)将其转换为数字。

让我们知道这是否有效。如果没有,请具体说明结果是什么以及它与您的预期有何不同。

更新

我刚刚注意到你正在使用xsltproc(它使用libxslt)。根据{{​​3}},libxslt本身支持date:difference(和date:seconds)。因此,您可以将这些函数称为函数,而不是定义命名模板并将其称为模板。这对你来说代码要少得多,虽然不那么便携:

<xsl:variable name="time-diff-sec"
    select="date:seconds(date:difference(start, end))" />

和以前一样,您需要在某处(通常在date元素上)声明xsl:stylesheet名称空间前缀:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:date="http://exslt.org/dates-and-times"
    extension-element-prefixes="date">

更新2:

有关便携式XSLT 1.0模板的信息,请参阅this documentation以将日期字符串转换为秒数,这样您就可以轻松地从另一个日期中减去一个日期。 (感谢Sam B的评论)。