我可以在XQuery中为XPath的步骤创建宏或缩写吗?

时间:2015-06-16 12:51:16

标签: xml xpath macros xquery

我们在XQuery中有Macros吗?

如果是,请举例说明一下它们的用法。

我有以下代码

let $x := //price/ancestor::*

我可以使用宏或其他东西编写如下:

let $x := //price/outward 

因此,outward应该是ancestor::*

2 个答案:

答案 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)