Вы не упомянули, какой процессор XQuery вы используете, но если у него есть хеш-карты, вы можете сделать это следующим образом (протестировано в MarkLogic Server):
let $seq := ("ADD X", "ADD Y", "REMOVE Z", "ADD X", "NO-ACTION Y")
let $map := map:map()
let $_ :=
for $s in $seq
let $parts := fn:tokenize($s, " ")
let $service := $parts[2]
let $action := $parts[1]
let $current-action := map:get($map, $service)
return
if ("NO-ACTION" = ($action, $current-action)) then
map:put($map, $service, "NO-ACTION") (: rule 1 :)
else if ("REMOVE" = ($action, $current-action)) then
map:put($map, $service, "REMOVE") (: rule 2 :)
else
map:put($map, $service, $action) (: actions are the same -- rule 3 :)
for $service in map:keys($map)
return fn:concat(map:get($map, $service), " ", $service)
Возвращает
ADD X
REMOVE Z
NO-ACTION Y
Обратите внимание, что я сделал упрощающее предположение и изменил «НЕТ ДЕЙСТВИЯ» на «НЕТ ДЕЙСТВИЯ», чтобы упростить анализ.