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> |
用户可以针对
如果用户要提交所有参数,查询可能如下所示:
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 |
但用户可以将某些参数留空,从而有效地使每个
我目前唯一可以组合的解决方案是使用一系列
在 Xpath 或 Xquery 中有什么方法可以用某种
1 2 3 | where $c/affiliation[if ($params_affil) then @corresp=($params_affil) else @corresp=* ] |
非常感谢。
使用
形式的谓词
1 | [$params_affil=("", @corresp)] |
如果 $params_affil 是零长度字符串或等于
或者,如果缺少参数的默认值为 (),则使用
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)] |