如何在 Xquery 函数 (BaseX) 中将字符串转换为 Xpath

How to convert string to Xpath in Xquery function (BaseX)

我正在为 BaseX 编写 Xquery 函数,它获取参数之一作为元素节点的名称。然后在 Xpath 中使用此名称,但通常我无法将字符串转换为元素。

方法是这样的

declare function prefix:getElementWithValue($root as document-node()?, $elem as xs:string?, $minVal as xs:float?, $maxVal as xs:float?)
as element()*

{ 
  let $e := element {$elem} {""}
  for $x in $root//SUBELEM
  return if ($x//$e/@ATTRIB>=$minVal and $x//$e/@ATTRIB<=$maxVal) then ($x)
};

和通话

return prefix:getElementWithValue($db, "SomeElem", 10.0, 10.0)

我得到的是空洞的回应。如果我用 $x//SomeElem 替换 $x//$e 它 returns 正确的响应。从 QueryPlan 我看到 $e 被视为文字值。 XPATH 不是 $x//SomeElem/@ATTRIB 而是 $x//$e/@ATTRIB

所以我的问题是如何将字符串转换为可在 XPATH 中使用的类型?

XQuery 没有评估 dynamically-constructed XPath 表达式的标准函数。

但是,许多 XQuery 处理器提供某种扩展函数来执行此操作。例如,BaseX 提供 query:eval():

https://docs.basex.org/wiki/XQuery_Module#xquery:eval

请注意,XQuery 中的变量表示值,而不是表达式文本的片段。您的表达式 $x//$e/@ATTRIB 等同于 $x//"SomeElem"/@ATTRIB,与 $x//SomeElem/@ATTRIB.

完全不同

如果你知道$elem永远是一个元素名,那么你可以写$x//*[name()=$e]/@ATTRIB。但要注意命名空间。