xquery可选的where语句

时间:2019-09-04 06:53:29

标签: xpath xquery

在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:idaffiliationauthorlocation提交可选参数,它们可以是具有多个值的参数(序列)。

如果用户要提交所有参数,则查询可能类似于:

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=* ] 

非常感谢。

2 个答案:

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