2012-08-23 71 views
1

我試圖找出哪個價格值是xquery中最小的值。我有兩個以XML格式傳遞的價格值,在嘗試比較值時,我似乎無法通過語法錯誤。比較xquery中的兩個十進制值

示例XML:

<purchase> 
    .... 
    <articlePrice>$20.00</articlePrice> 
    <issuePrice>$154.00</issuePrice> 
    .... 
</purchase> 

我有下面去掉了 '$'

let $price := fn:substring-after($price, '$') 
let $priceIssue := fn:substring-after($priceIssue, '$') 

我試圖使用內置的FN:MIN(),但給「XDMP -UNEXPECTED :(錯誤:XPST0003)意外的標記語法錯誤,意外的QName_「。

fn:min(((xs:decimal($price)), (xs:decimal($priceIssue)))) 

伊夫試圖在if語句中同時使用「GT」和「>」,但仍然得到上述語法錯誤。

我可以解決這些錯誤的唯一方法是將它們轉換爲字符串,但比較錯誤。鑑於上述數據,作爲字符串,邏輯返回'154.00'小於'20.00',因爲'1'小於'2'。

我的確切的代碼:

let $price := if (xs:string($ecommerce/articlePrice)) then fn:substring-after(xs:string($ecommerce/articlePrice), '$') else "" 

let $priceIssue := if (xs:string($ecommerce/issuePrice)) then fn:substring-after(xs:string($ecommerce/issuePrice), '$') else "" 

let $priceDisplay := fn:min(xs:decimal($price), xs:decimal($priceIssue)) 

結果XDMP-ARGTYPE:(ERR:XPTY0004)FN:分鐘(20.0,154.0) - ARG2不是類型xs:串

+0

在'$ priceDisplay'的表達式中['fn:min'](http://www.w3.org/TR/xquery-operators/#func-min)參數中缺少一對括號。正如它所寫的,它指的是雙參數版本,它有一個排序規則作爲第二個參數 - 因此是錯誤消息。相反,您需要單參數版本,將一系列值作爲參數傳遞,並且文字序列必須加上括號,除非它包含單個項目。另外請注意,您不能將空字符串轉換爲'xs:decimal',所以最好使用'else'表達式中的空序列,即'()'。 – Gunther

回答

2

I」不能確定你的完整代碼的樣子(這看起來有點粗略),但下面的查詢應該工作:

let $doc := 
    <purchase> 
    <articlePrice>$20.00</articlePrice> 
    <issuePrice>$154.00</issuePrice> 
    </purchase> 
let $price := fn:substring-after($doc/articlePrice, '$') 
let $priceIssue := fn:substring-after($doc/issuePrice, '$') 
return fn:min((xs:decimal($price), xs:decimal($priceIssue))) 
+0

謝謝基督徒。我添加了我的確切代碼。 – IronheadJay

+0

謝謝。現在只需要檢查並重新添加所刪除的零。上面的代碼返回20.5爲20.5。 – IronheadJay

+1

如果你的處理器支持XQuery 3.0,你可以使用'format-number(20.5,'0.00')';否則,您可能需要使用一些字符串操作。 –

0

如果你有這樣做的選擇,我會調整XML。現在,您正在混合數據的不同部分:數字值和貨幣。

let $doc := 
    <purchase> 
    <articlePrice curr="$">20.00</articlePrice> 
    <issuePrice curr="$">154.00</issuePrice> 
    </purchase> 
return fn:min(($doc/articlePrice, $doc/issuePrice)) 

這樣你的計算會容易得多。當您準備好向最終用戶展示某些東西時,您可以再次添加美元符號。另一個優點是:使用簡單的數字,你可以將這樣的元素索引爲數字而不是字符串(對於這種特殊情況可能不重要,但在很多情況下很有用)。