首页 > 解决方案 > xquery:将 where 子句放入变量中?通过变量构建 where 子句?

问题描述

我想知道是否可以像使用 Saxon 9.9HE(由 baseX 解决)一样创建查询:

let $where := '$x//element[text() = "content"]'
for $x in db:open("my_db")//something
where $where 
return $x//something_else

在我的应用程序中,where 子句是根据某些条件从外部构建的(PHP),我只是想将其传递给 xquery 脚本,以便我可以为所有查询使用一个基本脚本,每个查询在传递的方面都不同仅 where 子句。其他变量可以很容易地传递给脚本,因为它们不包含路径表达式,而只是 skalars。

变量中可以有表达式吗?

我尝试了xquery:eval()and xquery:parse()(两个 baseX 函数),但是没有成功。错误主要是未知变量 $xcontext is undeclared,或期待返回 如果没有发生错误,我会得到所有元素,因为 where 子句似乎评估为 true,因此只返回所有内容

我目前的解决方法是读取 xquery 脚本,替换 $where,然后执行它。有没有一个很好的方法可以单独在 xquery 中做到这一点?

标签: xquery

解决方案


所有查询插入和评估都受到代码注入问题的影响,因此请注意这一点,但在 BaseX 中,您需要在“where”字符串表达式的序言中声明变量,然后绑定它:

let $where := 'declare variable $x external; $x//element[text() = "content"]'
for $x in db:open("my_db")//something
where xquery:eval($where, map { "$x" : $x })
return $x//something_else

简单地编写一个查询函数或模块并使用它而不是将代码构造为字符串似乎更安全。


推荐阅读