我是XQuery 3.0的新手,并试图创建一个简单的多过滤搜索算法。
我想要做的是,检查是否提供了参数,如果是,请将其添加到查询中。
这就是我的想法:
let $query := doc("music.xml")//music/album
if (request:get-parameter('type', false)) then
let $query := $query[ @type=request:get-parameter('type', '') ]
else
let $query := $query
if (request:get-parameter('title', false)) then
let $query := $query[ @title=request:get-parameter('title', '') ]
else
let $query := $query
if (request:get-parameter('artist', false)) then
let $query := $query[ @artist=request:get-parameter('artist', '') ]
else
let $query := $query
这显然不正确。有任何帮助使其正确吗?
答案 0 :(得分:2)
最简单的模式如下,为每个可能的请求参数创建变量(为每个参数提供一个默认值作为空序列),然后在return子句中,检查每个参数是否存在,一次一个:
DECIMAL
此代码假定xquery version "3.0";
let $albums := doc("music.xml")//music/album
let $type := request:get-parameter('type', ())
let $title := request:get-parameter('title', ())
let $artist := request:get-parameter('artist', ())
return
if ($type) then
$albums[type = $type]
else if ($title) then
$albums[title = $title]
else if ($artist) then
$albums[artist = $artist]
else
$albums
,<type>
和<title>
是<artist>
的子元素,我们会检查所提供参数的完全匹配。对于区分大小写的字符串匹配,可以将<album>
比较更改为title = $title
,针对不区分大小写的正则表达式搜索,将contains(title, $title)
更改为matches(title, $title, 'i')
,如果配置了索引,则可以将ft:query(title, $title)
等全文索引更改为<title>
对于type
元素等的全文索引
这种方法的缺点是我们已经对查询中影响的参数严格编写了严格的优先顺序。如果提供了title
参数,则album
和xquery version "3.0";
let $albums :=
<albums>
<album><type>country</type><title>Holiday Classics</title><artist>Jane</artist></album>
<album><type>country</type><title>Lonesome Cowboy</title><artist>Jim</artist></album>
<album><type>country</type><title>Lonesome Holiday</title><artist>Jane</artist></album>
</albums>//album
let $type := request:get-parameter('type', ())
let $title := request:get-parameter('title', ())
let $artist := request:get-parameter('artist', ())
return
$albums
[if ($type) then type = $type else true()]
[if ($title) then title = $title else true()]
[if ($artist) then artist = $artist else true()]
上的查询即使已提供,也不会被考虑。
要将它们链接在一起以便查询任何和所有提供的参数,您可以采用以下方法:
{{1}}
我提供的样本数据只是为了确认自己和其他人测试这个有效的代码。仅在提供参数时才评估return子句中的比较。此代码假定每个参数最多一个值;如果您为每个参数允许多个值,则需要进行一些调整。