我们在XQuery中有Macros吗?
如果是,请举例说明一下它们的用法。
我有以下代码
let $x := //price/ancestor::*
我可以使用宏或其他东西编写如下:
let $x := //price/outward
因此,outward
应该是ancestor::*
答案 0 :(得分:1)
XQuery不知道这样的宏,你当然可以使用任何预处理器来做这些事情。
但我宁愿为此定义一个函数:
declare function local:outward($context as item()) {
$context/ancestor-or-self::*
};
也可以在轴步骤中应用函数(记住传递当前上下文.
):
let $xml := document { <foo><bar><batz>quix</batz></bar></foo> }
return $xml/foo/bar/local:outward(.)
你甚至可以继续,因为这将是一个正常的&#34; XPath表达式:
let $xml := document { <foo id="foo"><bar id="bar"><batz id="batz">quix</batz></bar></foo> }
return $xml/foo/bar/local:outward(.)/@id
答案 1 :(得分:1)
除了Jens回答(使用函数)...如果目标不仅仅是有语法糖,而且在某些时候让某人“配置”导航发生,你可以将Jens回答与功能结合起来项目。在XPath(和XQuery)3.0中,函数可以由函数项表示。功能项可以分配给变量,并可用于调用它“指向”的功能。
declare function local:outward($context as node()) {
$context/ancestor-or-self::*
};
declare function local:inward($context as node()) {
$context/descendant-or-self::*
};
declare function local:id($doc as node(), $axis as function(*)) {
(: note how we "call the variable $axis" :)
$doc/foo/bar/$axis(.)/@id
};
declare variable $input :=
document {
<foo id="foo"><bar id="bar"><batz id="batz"/></bar></foo> };
(: find the @id attributes in ancestors :)
local:id($input, local:outward#1)
,
(: find the @id attributes in descendants :)
local:id($input, local:inward#1)