【问题标题】:How do you switch on a string in XQuery?如何在 XQuery 中打开字符串?
【发布时间】:2010-09-10 06:56:29
【问题描述】:

我有一个以字符串形式出现的外部变量,我想对其进行开关/大小写。我如何在 xquery 中做到这一点?

【问题讨论】:

    标签: xml switch-statement xquery case


    【解决方案1】:

    从 XQuery 1.1 开始,使用 switch:

    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?" 
    

    【讨论】:

      【解决方案2】:

      只需使用一系列 if 表达式:

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

      使用类型开关隐藏了你真正在做什么。

      这些方法中哪种最有效将取决于您使用的 XQuery 处理器。在理想的世界中,这应该只是一个品味问题,因为应该由优化器来选择合适的方法,但如果性能很重要,那么值得对两个版本进行基准测试。如果处理器从您的示例中优化了节点构造,并且没有将我的示例优化为专门的开关,我会感到非常惊讶。

      【讨论】:

      • 如果你不忘记你正在做的事情,有时隐藏你真正在做的事情是很好和优雅的......
      • 我投了反对票,因为问题是试图找到 switch/case 的语法而不是 if/else。
      • @Sixty4Bit - 当我回答问题时,开关的行为尚未最终确定,这就是我在二月份发布第二个答案的原因!
      【解决方案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 唯一的解决方案。

      【讨论】:

      • 此解决方案将(应该)在任何 xquery 处理器中工作,但不如直接嵌套的 if 解决方案那么清晰。
      • 我只是讨厌嵌套的 if。我喜欢 XQuery 1.1 示例,因此我将其标记为答案。
      【解决方案4】:

      如果您的处理器支持 XQuery 1.1,那么您可以这样做:

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

      【讨论】:

        【解决方案5】:

        对于撒克逊人,您可以使用如下内容:

        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

        【讨论】:

          猜你喜欢
          • 2021-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多