The reason is subtle - <gap>'s @reason can occur  multiple times (<datatype>/@max="unbounded", implicit minimum of 1). so
when you specify a valList of "a | b | c", the processing turns that into

    a | b | c, (a | b |c)*

so achieve that range of 1-infinity. Why not, you ask 

   ( a | b | c) +

? well, thats just the way Syd wrote the code, to allow for @min > 1 as well as @min=1

But I'll simplify this code anyway.
Sebastian Rahtz      
Director (Research Support) of Academic IT Services 
University of Oxford IT Services
13 Banbury Road, Oxford OX2 6NN. Phone +44 1865 283431