关于 xpath:xquery 可选 where 语句

xquery optional where statements

在 Xquery 3.1 中,我正在处理来自表单的可变参数以搜索匹配的 XML 文档。 XML 文档如下所示:

1
2
3
4
5
6
7
8
9
<listBibl xml:id="TC0001" type="collection">
  <bibl>
    <title type="collection">Bonum universale de apibus
   
   
    <location corresp="flanders"/>
    <othercontent>....</othercontent>
  </bibl>
</listBibl>

用户可以针对xml:idaffiliationauthorlocation提交可选参数,可以是多个值(序列)的参数。

如果用户要提交所有参数,查询可能如下所示:

1
2
3
4
5
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 来解释参数为空的原因吗?在伪代码中,其中 * 表示希望使用的通配符:

1
2
3
 where $c/affiliation[if ($params_affil)
                      then @corresp=($params_affil)
                      else @corresp=* ]

非常感谢。


使用

形式的谓词

1
[$params_affil=("", @corresp)]

如果 $params_affil 是零长度字符串或等于 @corresp,则匹配。如果未提供参数,则将零长度字符串(而不是空序列)设为默认值。

或者,如果缺少参数的默认值为 (),则使用

1
[empty($params_affil) or $params_affil=@corresp)]

如果过于重复,请将逻辑放入用户声明的函数中。


我认为你总是可以声明和使用你自己的函数作为谓词表达式,例如

1
2
3
4
5
6
7
8
9
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)]