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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章