xquery参数查询

时间:2012-10-22 13:18:15

标签: xpath xquery exist-db

我正在尝试通过从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,但是一旦我开始工作就会有其他变量

1 个答案:

答案 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>