在Xquery 3.1中,我正在处理表单中的变量参数以搜索匹配的XML文档。 XML文档如下所示:
<listBibl xml:id="TC0001" type="collection">
<bibl>
<title type="collection">Bonum universale de apibus</title>
<affiliation corresp="dominican"/>
<author nymRef="thomas_cantipratensis"/>
<location corresp="flanders"/>
<othercontent>....</othercontent>
</bibl>
</listBibl>
用户可以针对xml:id
,affiliation
,author
和location
提交可选参数,它们可以是具有多个值的参数(序列)。
如果用户要提交所有参数,则查询可能类似于:
for $c in $mycollection//listBibl[@xml:id=($params_id)]
where $c/affiliation[@corresp=($params_affil)]
and $c/author[@nymRef=($params_author)]
and $c/location[@corresp=($params_location)]
return $c
但是用户可以将某些参数留空,从而使每个where
语句成为可选语句。
我目前可以汇总的唯一解决方案是使用一系列if...then...else
语句来说明参数的每个排列。
在Xpath或Xquery中,是否可以用某种wildcard
来解决参数为空的问题?在伪代码中,*
表示希望的通配符:
where $c/affiliation[if ($params_affil)
then @corresp=($params_affil)
else @corresp=* ]
非常感谢。
答案 0 :(得分:4)
使用形式的谓词
[$params_affil=("", @corresp)]
,如果$ params_affil是零长度字符串或等于@corresp
,则匹配。如果未提供该参数,则将零长度字符串(而不是空序列)设置为默认值。
或者,如果缺席参数的默认值为(),请使用
[empty($params_affil) or $params_affil=@corresp)]
如果这太重复了,请将逻辑放在用户声明的函数中。
答案 1 :(得分:2)
我认为您总是可以声明并使用自己的函数作为谓词表达式,例如
declare function local:check-item($item as node(), $values as item()*) as xs:boolean
{
if (exists($values))
then $item = $values
else true()
};
....
where $c/affiliation[local:check-item(@corresp, $params_affil)]