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

标签 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>

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

最佳答案

我为您完成了一些工作并找到了 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>

传递startend字符串作为模板的参数。你可以通过传递 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/

相关文章:

xml - 选择属性值最低的两个元素并将它们合并为输出中的一个元素

javascript - Ajax 获取 XML 数据类型比 Json 有什么优势吗?

c# - 如何使用 C# XmlReader 忽略未知的命名空间?

java - XML (XSL) 错误 — 将 HTML 转换为 PDF (Java)

xml - 使用 XSLT 拆分和展平节点

xml - 嵌套 <xsl :if> & <xsl:when>

xml - 连接 xml 文件

java - 从输入流 Java 解析 XML

xml - 测试选择时不采用 XSLT

c# - Xsd 架构命名空间