【问题标题】:Required item type of value of variable $duration is xs:string supplied value has item type xs:dayTimeDuration变量 $duration 值的所需项目类型是 xs:string 提供的值具有项目类型 xs:dayTimeDuration
【发布时间】:2018-03-11 18:14:34
【问题描述】:

我有两个不同的时间戳(以毫秒为单位)。对于这两个时间戳,我想知道它们之间的持续时间。持续时间是正确计算的,但我想格式化这个持续时间,然后 Eclipse 给我这个错误:

变量 $duration 的值的必需项类型是 xs:string 提供的值具有项目类型 xs:dayTimeDuration

<xsl:variable name="start" select='xs:dateTime("1970-01-01T00:00:00") + 1512037112064 * xs:dayTimeDuration("PT0.001S")'/>
<xsl:variable name="end" select='xs:dateTime("1970-01-01T00:00:00") + 1512059856670 * xs:dayTimeDuration("PT0.001S")'/>

<xsl:value-of select="xs:dateTime($end)-xs:dateTime($start)" />

没有任何形式的输出

PT6H19M4.606S

想要的格式化输出

6:19:4.606

【问题讨论】:

  • translate(string(xs:dateTime($end)-xs:dateTime($start)), 'HMPTS', '::') 够用吗?
  • 两种解决方案都对我有用。
  • 您的问题没有名为 $duration 的变量。此外,似乎有两个单独的问题(a)输出不是所需的格式,(b)类型错误。我很困惑。

标签: xml xslt-2.0


【解决方案1】:

首先,如果您有两个时间戳 $endTS$startTS,以毫秒为单位,获取它们之间持续时间的最简单方法是

xs:dayTimeDuration('PT0.001S') * ($endTS - $startTS)

您无需将两者都添加到虚拟开始时间,然后减去两个虚拟 dateTime 值。

其次,如果你想格式化一个H:M:S格式的持续时间,那么如果你知道持续时间小于24小时,你可以使用

format-time(xs:time('00:00:00') + $duration, '[H1]:[m1]:[s1].[f000]')

如果你不知道不到 24 小时你可以使用

concat(days-from-duration($d)*24 + hours-from-duration($d), ':',
  minutes-from-duration($d), ':', seconds-from-duration($d))

我不知道是什么导致了类型错误;您显示的代码没有声明或使用名为$duration 的变量。

【讨论】:

  • 对不起,这是我的错误。我稍微更改了代码,然后我没有检查它。变量持续时间只是变量,我尝试将PT6H19M4.606S 转换为所需的输出6:19:4.606
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 2020-10-18
  • 2022-01-23
  • 2010-11-07
  • 2019-05-01
  • 2021-03-13
相关资源
最近更新 更多