如何在Xquery函数(BaseX)中将字符串转换为Xpath
我正在为BaseX编写Xquery函数,它获取一个参数作为元素节点的名称。然后在Xpath中使用这个名称,但通常我无法将字符串转换为元素 这个方法就是这样的如何在Xquery函数(BaseX)中将字符串转换为Xpath,xpath,xquery,basex,Xpath,Xquery,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 := eleme
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)
};
我从中得到了空洞的回应。如果我将$x//$e
替换为$x//SomeElem
,它将返回正确的响应。从查询计划中,我看到$e
被视为文本值。XPATH不是$x//SomeElem/@ATTRIB
,而是$x/$e/@ATTRIB
所以我的问题是如何将字符串转换为可在XPATH中使用的类型?XQuery没有标准函数来计算动态构造的XPATH表达式 然而,许多XQuery处理器提供了某种扩展函数来实现这一点。例如,BaseX提供了query:eval(): 请注意,XQuery中的变量表示值,而不是表达式文本的片段。您的表达式
$x//$e/@ATTRIB
相当于$x//“SomeElem”/@ATTRIB
,这与$x//SomeElem/@ATTRIB
非常不同
如果您知道
$elem
始终是元素名,那么您可以编写$x/*[name()=$e]/@ATTRIB
。但是要注意名称空间。XQuery没有标准函数来计算动态构造的XPath表达式
然而,许多XQuery处理器提供了某种扩展函数来实现这一点。例如,BaseX提供了query:eval():
请注意,XQuery中的变量表示值,而不是表达式文本的片段。您的表达式$x//$e/@ATTRIB
相当于$x//“SomeElem”/@ATTRIB
,这与$x//SomeElem/@ATTRIB
非常不同
如果您知道$elem
始终是元素名,那么您可以编写$x/*[name()=$e]/@ATTRIB
。但是要注意名称空间
return prefix:getElementWithValue($db, "SomeElem", 10.0, 10.0)