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

时间:2015-08-02 16:50:12

标签: xml xquery

我有以下XML文档:

    [HttpPost]
    public ActionResult SavePost(Post post)
    {
            db.Posts.Add(post);
            db.SaveChanges();
            return RedirectToAction("index");
    }

我想将<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) 作为结果。我不明白我做错了什么。

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

1 个答案:

答案 0 :(得分:6)

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

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

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