xquery:将子句放在变量中?通过变量来建立子句?

时间:2019-06-14 09:42:16

标签: xquery

我想知道是否可以像使用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-clause是根据某些条件在外部构建的(PHP),我只是想将其传递给xquery脚本,以便我可以对所有查询使用一个基本脚本,每个基本脚本在仅通过子句。 其他变量可以轻松传递到脚本,因为它们不包含路径表达式,而只包含skalar。

是否可以在变量中使用表达式?

我尝试了xquery:eval()xquery:parse()(两个baseX函数),但是没有成功。错误主要是未知变量$ x 未声明上下文期望收益 如果没有错误发生,我会得到所有元素,因为where子句的求值结果为true,因此仅返回所有内容

我当前的解决方法是读取xquery脚本,替换$ where,然后执行它。是否有单独在xquery中执行此操作的好方法?

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

在撒克逊人中,等价物是

let $where := '$p1//element[text() = "content"]'
for $p1 in $collection//something
where saxon:evaluate($where, $x)
return $p1//something_else

变量必须命名为$ p1。 saxon:evaluate需要XPath表达式,而不是XQuery表达式,因此必须没有序言(即,没有变量声明)。

与其他Saxon扩展一样,saxon:evaluate()需要Saxon-PE或更高版本。

如果处理器具有XPath 3.1 fn:transform()函数的可用实现,则有一种相当复杂的方法无需扩展功能即可执行此操作。您将动态表达式包装在样式表中:

let $ss := "<xsl:transform....><xsl:function name='Q{zzz}predicate' as='xs:boolean'><xsl:param name="p"><xsl:sequence select='$p/" + $condition + "'/></xsl:transform>"

然后评估您使用的条件

fn:transform(map{'stylesheet-string':$ss, 'initial-function':QName('zzz', 'predicate'), 'function-params':map{QName('','p'):$x}})?output
相关问题