Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何在XSLT1.0中计算时间差(持续时间)?_Xml_Xslt - Fatal编程技术网

Xml 如何在XSLT1.0中计算时间差(持续时间)?

Xml 如何在XSLT1.0中计算时间差(持续时间)?,xml,xslt,Xml,Xslt,我使用xlstproc将一些xml文件转换为另一个xml格式文件,在转换过程中,我需要计算开始和结束字段之间的时间差值(持续时间以秒或分:秒为单位) 。。。 2011-12-13 16:15:26 2011-12-13 16:17:27 … 我找到了一个模板语法,但未能使用它 <xsl:call-template name="date:duration"> <xsl:with-param name="seconds" select="number" />? </

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

。。。
2011-12-13 16:15:26
2011-12-13 16:17:27
…

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

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

?

如果有人能给我一个如何实现目标的提示,我将不胜感激。提前谢谢

我帮你做了一些工作,发现了一些你似乎正在尝试使用的东西。但是,date:duration将秒数转换为duration格式的字符串,而您希望查找两个datetime字符串之间的差异(duration)

你可能会想要。 如果您阅读了,您会发现关于参数:

这两个日期必须都是其中一个中右截断的日期/时间字符串 [XML模式第2部分:数据类型]中定义的格式。。。允许的格式如下

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>
此代码假定上下文节点是
元素的父节点。在上述代码之后,变量
$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))" />
更新2:
有关将日期字符串转换为秒数的可移植XSLT1.0模板,请参阅,该模板允许您轻松地从一个日期减去另一个日期。(感谢Sam B的评论)。

不确定“模板语法”是什么意思。你是说你找到了一个模板,用来计算两个时间字符串之间的时间差?在任何情况下,如果您显示或链接到模板实现,并描述它是如何失败的,我们可能会帮助您。它与更新部分中的建议一起工作,非常感谢@卡尔博齐诺,不客气。很高兴这有帮助。如果答案解决了你的问题,请勾选“接受”复选框。另一个完美答案-
<xsl:variable name="time-diff-sec"
    select="date:seconds(date:difference(start, end))" />
<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">