我试图找出xquery中最小的价格值。我在XML中传递了两个价格值,在尝试比较值时似乎无法获得语法错误。
示例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))))
我尝试过同时使用'gt'和'&gt;'在if语句中,但仍然会出现上面的语法错误。
我可以解决错误的唯一方法是将它们作为字符串进行转换,但比较是错误的。给定上面的数据,作为字符串,逻辑返回'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:(错误:XPTY0004)fn:min(20.0,154.0) - arg2的类型不是xs:string
答案 0 :(得分:3)
我不确定你的完整代码是什么样的(它看起来有点粗略),但以下查询应该有效:
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)))
答案 1 :(得分:1)
如果您可以选择这样做,我会调整XML。现在,您正在混合数据的不同部分:数值和货币。
let $doc :=
<purchase>
<articlePrice curr="$">20.00</articlePrice>
<issuePrice curr="$">154.00</issuePrice>
</purchase>
return fn:min(($doc/articlePrice, $doc/issuePrice))
通过这种方式计算会更容易。然后,当您准备向最终用户展示某些内容时,您可以重新添加美元符号。另一个优点:使用简单的数字,您将能够将这样的元素索引为数字而不是字符串(对于这种特殊情况可能并不重要,但在很多情况下都很有帮助)。