Xquery:There is more than one method matching the function 异常处理

来源:互联网 发布:90后童年游戏 知乎 编辑:程序博客网 时间:2024/06/05 02:37

本人系统使用了saxon9作为xquery脚本解析工具,在对数字进行相加的时候,由于浮点型数字容易出现精度丢失,因此,在脚本中定义了命名空间,准备引入java.util.Math中的round函数使用保留小数位的方法来对浮点数进行转换,脚本片段如下

declare namespace math = 'java:java.lang.Math';<body><table class="fb_result" width="100%"><tr class="fb_result_head"><th colspan="100">余额信息</th></tr><tr class="fb_result_head"><td width="2%"></td><td width="13%">ID</td><td width="17%">名称</td><td width="8%">总额(元)</td><td width="8%">已用(元)</td><td width="8%">可用(元)</td></tr>{for $a in //Record return    <tr class="fb_result_content">        <td><input type="radio" name="radiobutton" value="radiobutton" checked="checked" onclick="saveId({$a/Id})"/></td><td>{$a/Id}</td><td>{$a/Name}</td><td>{$a/All}</td><td>{xs:double(math:round(($a/All/number() - $a/Available/number())*1000) div 1000.00)}</td>        <td>{$a/Available}</td>    </tr>}{let $sum1 :=sum(//Record/Available/number())let $sum2 :=sum(//Record/All/number())return<tr class="fb_result_content" style="font-weight:bold;">   <td align="left" colspan="3">小计</td><td>{$sum2}</td><td>{xs:double(math:round(($sum2 - $sum1)*1000) div 1000.00)}</td><td>{$sum1}</td><td colspan="4"></td></tr>}</table></body>

但是,在执行脚本解析的时候,系统报错如下

Caused by: net.sf.saxon.trans.XPathException: There is more than one method matching the function call math:round, and there is insufficient type information to determine which one should be usedat net.sf.saxon.functions.JavaExtensionLibrary$UnresolvedExtensionFunction.typeCheck(JavaExtensionLibrary.java:901)at net.sf.saxon.expr.ExpressionVisitor.typeCheck(ExpressionVisitor.java:181)at net.sf.saxon.expr.ArithmeticExpression.typeCheck(ArithmeticExpression.java:78)at net.sf.saxon.expr.ExpressionVisitor.typeCheck(ExpressionVisitor.java:181)at net.sf.saxon.instruct.ParentNodeConstructor.typeCheck(ParentNodeConstructor.java:165)at net.sf.saxon.expr.ExpressionVisitor.typeCheck(ExpressionVisitor.java:181)at net.sf.saxon.instruct.Block.typeCheck(Block.java:447)at net.sf.saxon.expr.ExpressionVisitor.typeCheck(ExpressionVisitor.java:181)at net.sf.saxon.instruct.ParentNodeConstructor.typeCheck(ParentNodeConstructor.java:165)at net.sf.saxon.expr.ExpressionVisitor.typeCheck(ExpressionVisitor.java:181)at net.sf.saxon.expr.LetExpression.typeCheck(LetExpression.java:110)at net.sf.saxon.expr.ExpressionVisitor.typeCheck(ExpressionVisitor.java:181)at net.sf.saxon.expr.LetExpression.typeCheck(LetExpression.java:110)at net.sf.saxon.expr.ExpressionVisitor.typeCheck(ExpressionVisitor.java:181)at net.sf.saxon.instruct.Block.typeCheck(Block.java:447)at net.sf.saxon.expr.ExpressionVisitor.typeCheck(ExpressionVisitor.java:181)at net.sf.saxon.instruct.ParentNodeConstructor.typeCheck(ParentNodeConstructor.java:165)at net.sf.saxon.expr.ExpressionVisitor.typeCheck(ExpressionVisitor.java:181)at net.sf.saxon.instruct.Block.typeCheck(Block.java:447)at net.sf.saxon.expr.ExpressionVisitor.typeCheck(ExpressionVisitor.java:181)at net.sf.saxon.instruct.ParentNodeConstructor.typeCheck(ParentNodeConstructor.java:165)at net.sf.saxon.expr.ExpressionVisitor.typeCheck(ExpressionVisitor.java:181)at net.sf.saxon.query.XQueryExpression.<init>(XQueryExpression.java:72)at net.sf.saxon.query.QueryParser.makeXQueryExpression(QueryParser.java:121)at net.sf.saxon.query.StaticQueryContext.compileQuery(StaticQueryContext.java:343)at net.sf.saxon.xqj.SaxonXQExpression.executeQuery(SaxonXQExpression.java:103)... 32 more

但是,本人在小计片段没有使用math:round函数的时候,脚本工作正常。后来查看java.util.Math类的API,发现Math.round()有两个函数,但是参数不同,一个为浮点型,一个为整形,所以本人怀疑上面代码报错是由于参数类型没有明确定义。因此,修改小计模块的脚本片段如下后

{xs:double(math:round((xs:float($sum2 - $sum1))*1000) div 1000.00)}

脚本工作恢复正常。

结论:

在xquery中通过命名空间引用外部函数时,如果函数有多种入参类型,那么在脚本中使用该外部函数时,要明确入参的类型。