为什么 XQuery return 是除数而不是除法结果?

Why does XQuery return the divisor instead of the division result?

我有以下 XML 文档:

<releases>
  <release>
    <videos>
      <video duration="599" embed="true" src="http://www.youtube.com/watch?v=TivSU1-ASPQ"/>
    </videos>
  </release>
</releases>

我想将 @duration 转换为分钟和秒。我正在使用以下代码转换

declare namespace local = "http://www.foobar.org";
declare function local:convert($v) as xs:decimal?
{
  $v/60
};

let $r := doc("releases.xml") return
for $i in $r/releases/release/videos/video
return local:convert($i/@duration)

但是,我得到的结果是 60。我不明白我做错了什么。

PS:请注意我有多个视频,这就是我使用 FLWOR 表达式的原因。

在XQuery中,/不是除法运算符,而是轴步。请改用 div。您的查询 return 是每个 $v 的小数 60。您也可以尝试 (<foo/>, <bar/>)/42 以获得类似的结果,这将 return 数字 42 两次。

此外,对于不兼容的类型,该函数将失败。除法的结果是 xs:double,而不是 xs:decimal(仅适用于整数)。将函数声明为 returning xs:double(或者 cast/round to a decimal,如果你想要整数)。

declare function local:convert($v) as xs:double?
{
  $v div 60
};