1

URLからパラメーターを取得し、検索パラメーターを構築することにより、xqueryでexist-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 は、パラメーターが存在するかどうかを確認し、それに基づいてクエリ パラメーターを作成します。この変数は問題なく動作します。テストから、パラメータがない場合は「*」または

contributions/person/@val='hello, world'

クエリを実行すると、値が「*」であるかのように出力されます。for $x の部分で、そのような変数を渡すことはできますか? 同じ結果で concat($person,'') を入れてみました。フルパスをハードコーディングすると、探している結果が得られますが、より動的なものを作成したいと考えています。

注: 変数は $person の 1 つだけですが、動作させると他の変数も存在します。

4

1 に答える 1

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>
于 2012-10-22T15:17:37.423 に答える