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

本人系统使用了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" οnclick="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 used
	at 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中通过命名空间引用外部函数时,如果函数有多种入参类型,那么在脚本中使用该外部函数时,要明确入参的类型。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值