如何在 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
。但要注意命名空间。
我正在为 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
。但要注意命名空间。