我使用 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>
如果有人能给我提示如何实现我的目标,我将不胜感激。提前致谢!
最佳答案
我为您完成了一些工作并找到了 this date:duration function ,您似乎正在尝试使用它。但是,date:duration 将秒数转换为持续时间格式的字符串,而您想找出两个日期时间字符串之间的差异(持续时间)。
你可能想要 date:difference反而。 如果您阅读 documentation for this function/template ,您会发现有关参数的信息:
The two dates must both be right-truncated date/time strings in one of the formats defined in [XML Schema Part 2: Datatypes]. ... The permitted formats are as follows...
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>
传递start
和 end
字符串作为模板的参数。你可以通过传递 start
来做到这一点和 end
元素节点,将根据其文本内容自动转换为字符串:
<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)。根据this documentation , libxslt 支持 date:difference
(和 date:seconds
) native 。所以你可以把这些函数当作函数来调用,而不是定义一个命名模板,然后把它当作模板来调用。这对你来说会少很多代码,尽管不那么便携:
<xsl:variable name="time-diff-sec"
select="date:seconds(date:difference(start, end))" />
和以前一样,您需要声明 date
某处的 namespace 前缀,通常在您的 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:
参见 this answer用于将日期字符串转换为秒数的可移植 XSLT 1.0 模板,这使您可以轻松地从一个日期中减去另一个日期。 (感谢 Sam B 的评论)。
关于xml - 如何计算 xslt 1.0 中的时间差(持续时间)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8729628/