1

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 型ではありません

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

あなたの計算は、この方法ではるかに簡単になります。エンド ユーザーに何かを提示する準備ができたら、ドル記号を元に戻すことができます。もう 1 つの利点: 単純な数値を使用すると、このような要素を文字列ではなく数値としてインデックス化できます (この特定のケースでは重要ではないかもしれませんが、多くの場合に役立ちます)。

于 2012-08-31T14:31:53.953 に答える