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中通過命名空間引用外部函數時,如果函數有多種入參類型,那麼在腳本中使用該外部函數時,要明確入參的類型。



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