我使用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>
很感激有人可以给我一个提示如何实现我的目标。提前谢谢!
答案 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>
将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)。根据{{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">
有关便携式XSLT 1.0模板的信息,请参阅this documentation以将日期字符串转换为秒数,这样您就可以轻松地从另一个日期中减去一个日期。 (感谢Sam B的评论)。