如何在typeswitch表达式中检查动态元素名称?

时间:2015-11-24 07:06:19

标签: xquery marklogic

此问题与How to add attribute to all particular children of a node有关。

import module namespace functx = "http://www.functx.com" at "MarkLogic/functx/functx-1.0-doc-2007-01.xqy";
declare function local:change($node) 
{ 
  typeswitch($node) 
    case element(add) return 
      functx:add-attributes($node, xs:QName('att1'), 1)
    case element() return 
      element { fn:node-name($node) } { 
        $node/@*, 
        $node/node() ! local:change(.)
      } 
    default return $node 
};
let $test := <test>
                <add>x1</add>
                <c><add>x2</add></c>
                <b>x</b>
             </test>

return local:change($test)

需要动态检查要添加的属性的元素。它是从外面驱动的。所以我尝试将要添加的元素的名称作为参数发送到local:change函数,但typeswitch case不接受动态值。如何检查这是typeswitch表达式?

1 个答案:

答案 0 :(得分:4)

Typeswitch只允许固定元素名称,而不是根据XQuery定义的变量。不是匹配typeswitch中的<add/>元素,而是匹配所有元素并使用local-name(...)(如果必须匹配名称空间,则使用name(...)),而不是区分值。

import module namespace functx = "http://www.functx.com" at "MarkLogic/functx/functx-1.0-doc-2007-01.xqy";
declare function local:change($node, $name) 
{ 
  typeswitch($node) 
    case element() return 
      if (local-name($node) eq $name)
      then
        functx:add-attributes($node, xs:QName('att1'), 1)
      else element { fn:node-name($node) } { 
          $node/@*, 
          $node/node() ! local:change(., $name)
        } 
    default return $node 
};
let $test := <test>
                <add>x1</add>
                <c><add>x2</add></c>
                <b>x</b>
             </test>

return local:change($test, "add")