此问题与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
表达式?
答案 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")