xquery - 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 函数),但是没有成功。错误主要是未知变量 $x,context is undeclared,或期待返回
如果没有发生错误,我会得到所有元素,因为 where 子句似乎评估为 true,因此只返回所有内容
我目前的解决方法是读取 xquery 脚本,替换 $where,然后执行它。有没有一个很好的方法可以单独在 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
简单地编写一个查询函数或模块并使用它而不是将代码构造为字符串似乎更安全。
推荐阅读
- ruby - ruby on rails 中的类和模型
- javascript - 在 d3 v4 中的矩形之间添加链接
- javascript - 谷歌地图集群不会将彼此靠近的标记分开以供 infoWindow 显示信息
- python - 无法在 python 中嵌入 youtube-dl
- python - 有人可以向我解释为什么我的代码有效吗?(异步蟒蛇)
- twilio - Twilio TwiML 设置参与者标签
- elasticsearch - 在 nginx 访问日志中捕获响应正文的 grok 模式
- hook - SugarCRM 识别记录是从 after_save 钩子创建或更新的
- google-sheets - 对从 finviz 提取的值进行平均时出错
- javascript - PHP和Javascript JWA之间的不同数字签名结果