比较xquery中的两个十进制值

时间:2012-08-23 18:20:27

标签: comparison decimal xquery

我试图找出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

2 个答案:

答案 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))

通过这种方式计算会更容易。然后,当您准备向最终用户展示某些内容时,您可以重新添加美元符号。另一个优点:使用简单的数字,您将能够将这样的元素索引为数字而不是字符串(对于这种特殊情况可能并不重要,但在很多情况下都很有帮助)。