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

Kar*_*ino 3 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>
Run Code Online (Sandbox Code Playgroud)

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

Lar*_*rsH 6

我为你做了一些工作并找到了这个日期:持续时间功能,你似乎试图使用它.但是,date:duration将秒数转换为持续时间格式化的字符串,而您希望找到两个日期时间字符串之间的差异(持续时间).

你可能想要约会:差异.如果您阅读了此函数/模板文档,您将找到有关参数的信息:

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

xs:dateTime (CCYY-MM-DDThh:mm:ss)
...
Run Code Online (Sandbox Code Playgroud)

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

所以我建议修复:

<start>2011-12-13T16:15:26</start>
  <end>2011-12-13T16:17:27</end>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

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

更新:

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

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

和以前一样,您需要在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">
Run Code Online (Sandbox Code Playgroud)

更新2:

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

  • 不错的研究,LarsH. (3认同)