我正在尝试通过从URL中获取参数并构建搜索参数来查询带有xquery的exists-db
xquery version "1.0";
declare namespace request="http://exist-db.org/xquery/request";
declare namespace xs="http://www.w3.org/2001/XMLSchema";
declare option exist:serialize "method=xml media-type=text/xml omit-xml-declaration=no indent=yes";
let $param1:= request:get-parameter("param1",'0')
let $person :=
if($param1 = '0')
then "'*'"
else concat('contributions/person/@val="',$param1,'"')
return
<xml>
{
for $x in subsequence(//foo/bar[$person],1,3)
return $x
}
</xml>
上面的代码显示我从url $ param1获取参数。
变量$ person检查是否有参数,并根据该参数创建查询参数。这个变量工作正常,从测试开始输出'*'表示没有param或
contributions/person/@val='hello, world'
当我运行查询时,它会打印出来,好像值为'*'。在for $ x部分,我可以传递这样的变量吗?我试过把concat($ person,'')用同样的结果。硬编码完整路径为我提供了我正在寻找的结果,但我希望创建更具动态性的东西。
要注意:只有一个变量$ person,但是一旦我开始工作就会有其他变量
答案 0 :(得分:1)
我认为理想情况下你会避免动态字符串评估。在这个例子中,一些非常简单的重组可以在没有它的情况下解决问题:
<xml>
{
for $x in subsequence(//foo/bar[
if ($param1 = '0')
then *
else (contributions/person/@val = $param1)
],1,3)
return $x
}
</xml>
但是,您可以使用eval()
,但请注意存在安全风险:
<xml>
{
for $x in subsequence(eval(
concat('//foo/bar[',$person,']')
),1,3)
return $x
}
</xml>