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 <l...@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.
>
>

Reply via email to