我正在为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
,它会返回正确的响应。从QueryPlan中,我看到$e
被视为文字值。XPATH不是$x//SomeElem/@ATTRIB
,而是$x//$e/@ATTRIB
所以我的问题是如何将字符串转换为可以在XPATH中使用的类型?
发布于 2020-10-31 22:11:55
XQuery没有用于计算动态构造的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
。但是要注意命名空间。
https://stackoverflow.com/questions/64626553
复制相似问题