У меня есть ряд узлов xml, которые выглядят следующим образом:
let $x :=
<works>
<work xml:id="W1">
<author corresp="AU08"/>
<group corresp="GR03"/>
</work>
<work xml:id="W2">
<author corresp="AU09"/>
<group corresp="GR10"/>
</work>
<work xml:id="W3">
<author corresp="AU08"/>
<group corresp="GR05"/>
</work>
....
</works>
У меня есть форма поиска, которая может предлагать или не предлагать параметры последовательности для work/@xml:id
, work/author/@corresp
и work/affiliation/$corresp
Например:
let $xmlids := ("W1")
let $authors := ()
let $groups := ("GR05","GR08")
или
let $xmlids := ()
let $authors := ("AU01","AU08")
let $groups := ("GR05")
Я пытаюсь создать эффективный запрос в Xquery 3.1 (eXist 4.7) для учета различных перестановок параметров при выводе work/
.Это привело меня к созданию уродливой серии вложенных if
операторов, которые пытаются отдать предпочтение предикатам над for ...where
, например, следующим образом:
if (count($xmlids) gt 0 and count($authors) gt 0 and count($groups) gt 0)
then
$x/id($xmlids)/author[@corresp=$authors]/parent::work/group[@corresp=$groups]/parent::work
else if (count($xmlids) gt 0 and count($authors) gt 0 and count($groups) eq 0)
then
$x/id($xmlids)/author[@corresp=$authors]/parent::work
else if ...
Существует ли более эффективный способ построения Xquery с учетом переменнойпараметры присутствия / отсутствия?
Большое спасибо заранее.