开发者问题收集

xquery:将 where 子句放入变量?通过变量构建 where 子句?

2019-06-14
159

我想知道是否可以像使用 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 子句上有所不同。 其他变量可以轻松传递给脚本,因为它们不包含路径表达式,而只包含 skalar。

变量中可以有表达式吗?

我尝试使用 xquery:eval()xquery:parse() (均为 baseX 函数),但均未成功。错误大多是 未知变量 $x 上下文未声明 期望返回 如果没有发生错误,我将获得所有元素,因为 where 子句似乎计算结果为 true,因此返回所有内容

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

2个回答

所有查询插入和评估都受代码注入问题的影响,因此请小心处理,但在 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

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

Martin Honnen
2019-06-14

在撒克逊人中,等效是

768339727

该变量必须命名为$ p1。萨克森:评估期望的是xpath表达式,而不是xquery表达式,因此必须没有prolog(即没有可变声明)。

像其他撒克逊人扩展一样, saxon:evaluate() >需要撒克逊人或更高。

有一种相当复杂的方法可以在没有扩展功能的情况下执行此操作,前提。您将动态表达式包装在样式表中:

908166946

,然后评估使用

208241857 >
Michael Kay
2019-06-14