If you put your "possibles" in an array rather than a sequence  then the index of the first non-empty item
identifies the match.

let $results := [$possible1,$possible2,$possible3,$possible4,$possible5,'FAILED']

let $index:= array:fold-left($results,
                       -1,
                       function($acc,$this){
                          if($acc gt 0)then $acc else
                          if (exists(array:get($results,-$acc))) then  -$acc else $acc -1
                      })

let $foundIt:= array:get($results,$index)

This seems a bit tricksy, using the BaseX specific higher order function hof:until [1] is cleaner

let $index:= hof:until(
          function($index){ exists(array:get($results,$index)) },
          function($index){ $index+1 },
          1)

/Andy

[1] http://docs.basex.org/wiki/Higher-Order_Functions_Module#hof:until


On 14 September 2018 at 07:38, Liam R. E. Quin <liam@fromoldbooks.org> wrote:
On Thu, 2018-09-13 at 16:18 -0400, Graydon Saunders wrote:
> let $possible1 as xs:string* := (: go looking for a value via one
> route :)
> let $possible2 .... (: all the other routes in preference order :)
> ....
> let $foundIt as xs:string :=
> ($possible1,$possible2,$possible3,$possible4,$possible5,'FAILED')[1]
>
> This works nicely in terms of "I got the value by the least-bad
> route".
> What I'm blanking on is "how do I tell which was the first
> possibility to
> match?" without resorting to sprawl of if-then-else statements.  I
> have the
> idea that there must be a compact way but I have no idea what it is
> if
> there is.

Don't use variables - just construct a sequence,
let $possibles as xs:string := (
   stuff to make possible1,
   stuff to make possible 2,
   . . .
   'fallback value'
   )[1]
>

Liam


--
Liam Quin, https://www.holoweb.net/liam/cv/
Web slave for vintage clipart http://www.fromoldbooks.org/
Available for XML/Document/Information Architecture/
XSL/XQuery/Web/Text Processing/A11Y work/training/consulting.