为什么 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
};
我有以下 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
};