Hi Adam,
It’s recommendable to use xs:decimal instead of xs:float. Here’s one solution…
declare function local:sumVec($seq) { let $count := max(($seq ! string() ! replace(., '[^_]', '') ! string-length())) + 1 let $sums := ( for $c in 1 to $count return sum( for $item in $seq let $tokens := tokenize(string($item), '_') return try { xs:decimal($tokens[$c]) } catch * { 0 } ) ) return string-join($sums, '_') };
…and another one (presumably more cryptic):
declare function local:sumVec($seq) { let $numbers := ( for $item in $seq return array { for $token in tokenize(string($item), '_') return try { xs:decimal($token) } catch * { 0 } } ) return string-join( for $c in 1 to max($numbers ! array:size(.)) return sum($numbers[array:size(.) >= $c]?($c)) , '_') };
Hope this helps, Christian