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

xquery:将where子句放入变量?通过变量构建where子句?,xquery,Xquery,我想知道是否有可能在使用Saxon 9.9HE(由baseX解决)时创建这样的查询: 在我的应用程序中,where子句是基于某些条件在外部(PHP)构建的,我只想将其传递给xquery脚本,这样我就可以为所有查询使用一个基本脚本,每个基本脚本只在passed by where子句中有所不同。 其他变量可以很容易地传递给脚本,因为它们不包含路径表达式,只包含skalar 变量中可能有表达式吗 我尝试了一些xquery:eval()和xquery:parse()(都是baseX函数),但是没有成功。

我想知道是否有可能在使用Saxon 9.9HE(由baseX解决)时创建这样的查询:

在我的应用程序中,where子句是基于某些条件在外部(PHP)构建的,我只想将其传递给xquery脚本,这样我就可以为所有查询使用一个基本脚本,每个基本脚本只在passed by where子句中有所不同。 其他变量可以很容易地传递给脚本,因为它们不包含路径表达式,只包含skalar

变量中可能有表达式吗

我尝试了一些
xquery:eval()
xquery:parse()
(都是baseX函数),但是没有成功。错误主要是未知变量$x、上下文未声明或期望返回 如果没有发生错误,我将获得所有元素,因为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

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

所有查询插入和求值都会遇到代码注入的问题,因此要小心,但在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

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

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表达式,因此必须没有prolog(即没有变量声明)

与其他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>"

在撒克逊,等价物是

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表达式,因此必须没有prolog(即没有变量声明)

与其他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>"

你到底使用哪种XQuery处理器?哦,对不起:是Saxon 9.9He,但Saxon 9.9他没有
XQuery:eval
XQuery:parse
函数。它在baseX后面。我在问题中更新了这个。你到底使用哪种XQuery处理器?哦,对不起:是Saxon 9.9He,但Saxon 9.9他没有
XQuery:eval
XQuery:parse
函数。它在baseX后面。我在问题中更新了。再次感谢。在我的一次尝试中,我已经接近了这一点,但是再次把声明放在了感谢的外面。在我的一次尝试中,我已经接近了这一点,但是把声明放在了外面