xqueryでどの価格値が最も小さいかを見つけようとしています。XML で 2 つの価格値が渡されていますが、値を比較しようとしても過去の構文エラーが発生するようには見えません。
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: (err:XPST0003) Unexpected token syntax error, unexpected QName_」が表示されます。
fn:min(((xs:decimal($price)), (xs:decimal($priceIssue))))
if ステートメントで 'gt' と '>' の両方を使用しようとしましたが、それでも上記の構文エラーが発生します。
エラーを回避できる唯一の方法は、エラーを文字列としてキャストすることですが、比較が間違っています。上記のデータを指定すると、「1」は「2」よりも小さいため、ロジックは文字列として「154.00」を「20.00」よりも小さいものとして返します。
私の正確なコード:
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:min(20.0, 154.0) -- arg2 は xs:string 型ではありません