1

我试图找出 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: (err:XPST0003) Unexpected token syntax error, unexpected 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:min(20.0, 154.0) -- arg2 不是 xs:string 类型

4

2 回答 2

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)))
于 2012-08-23T18:46:29.893 回答
1

如果您可以选择这样做,我会调整 XML。现在,您正在混合数据的不同部分:数值和货币。

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

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

于 2012-08-31T14:31:53.953 回答