13

文字列として入ってくる外部変数があり、それに対してスイッチ/ケースを実行したいと考えています。xqueryでそれを行うにはどうすればよいですか?

4

5 に答える 5

25

XQuery 1.1 以降では、次のスイッチを使用します。

http://www.w3.org/TR/xquery-11/#id-switch

switch ($animal) 
   case "Cow" return "Moo"
   case "Cat" return "Meow"
   case "Duck" return "Quack"
   default return "What's that odd noise?" 
于 2010-05-04T16:19:41.650 に答える
4

一連のif式を使用するだけです。

if ($room eq "bathroom") then "loo"
else if ($room eq "kitchen")  then "scullery"
else "just a room"

タイプスイッチを使用すると、実際に行っていることを隠すことができます。

これらの方法のどれが最も効率的かは、使用しているXQueryプロセッサによって異なります。理想的な世界では、適切な方法を選択するのはオプティマイザーに任されているため、好みの問題である必要がありますが、パフォーマンスが重要な場合は、両方のバージョンのベンチマークを行う価値があります。プロセッサがあなたの例からノード構造を最適化し、私の例を特殊なスイッチに最適化しなかったとしたら、私は非常に驚きます。

于 2008-10-05T11:30:59.460 に答える
3

XQuery には要素以外を切り替える機能がありません。

最初に行うことは、文字列を要素に変換することです。

let $str := "kitchen"
let $room := element {$str} {}

次に、typeswitch を使用して通常の切り替えを行います。

return typeswitch($room)
  case element(bathroom) return "loo"
  case element(kitchen) return "scullery"
  default return "just a room"

これは MarkLogic のみのソリューションである可能性があることに注意してください。

于 2008-09-17T17:47:44.767 に答える
3

プロセッサが XQuery 1.1 をサポートしている場合は、次のように簡単に実行できます。

switch ($room) 
  case "bathroom" return "loo"
  case "kitchen" return "scullery"
  default return "just a room"
于 2010-02-14T18:02:41.237 に答える
1

Saxon の場合、次のようなものを使用できます。

declare function a:fn($i) {
typeswitch ($i)
 case element(a:elemen1, xs:untyped) return 'a' 
 case element(a:elemen2, xs:untyped) return 'b' 
 default return "error;"
};

https://rrusin.blogspot.com/2010/01/xquery4j-in-action.html

于 2010-01-18T02:42:28.273 に答える