Support for XForm Sort Expression

I have a use case that requires the calculation of the Median value of a set collected in a Repeat Group. The use case if for measuring standing timber volumes. When you are measuring a stand you first measure the diameter of all stems in the plot. You then measure the height of a sub-set of those stems. In my use-case you measure the height of the maximum and median stem for every species present in the plot. I am able to calculate the maximum using the max() function, but there is no equivalent for median. I therefore tried adjusting the Xform code to include:

position(sort(${my_nodeset}), count(${my_nodeset}) div 2 + 1)

As a method of calculating the median. The form uploaded to ODK Central without issue but when I tried to use it with ODK Collect I got the following error message:

Error Occurred Error evaluating field ... The problem was located in Calculate expression for ... XPath evaluation: cannot handle function 'sort'

It seems that the XForm sort() function is not part of the ODK XForm specification.

I would like to add the XForm sort() function to enable the sorting of nodesets. This will allow me to calculate the median tree diameter in a plot.

1 Like

This is not an area I'm familiar with but have you looked at the code repository for the ODK XForms spec? The readme includes a small section on proposing specification changes.

1 Like

Thanks for describing your use case in detail, @Phil_Burapha!

Given that your underlying need is for computing a median, would a median function work for you? I don't see any such thing in core XPath/XQuery/XForm but I do see that MarkLogic has a custom median function:

I can't find a reference to an XForm sort function, do you have a link? I see this article about an XLST-based alternative (wouldn't be supported by ODK tools). It looks like Orbeon Forms has a custom function.

Thanks for pointing to that spec proposal section, @danbjoseph! We don't do formal voting these days and should update that. This thread is a fine feature proposal and will be helpful for gauging level of interest/need.

1 Like

I poked around too, and only found this:

Which is XPath 3.1 (!), and doesnt appear to be strictly a (new) XPath function per se, but rather a so-called 'higher order function'; something that appears to involve invoking the host language... :thinking:

But I agree having something at least rudimentary to permit sorting multiple values from a nodeset (or selection?) in some form could potentially be useful for a lot of applications, beyond the basic current min() & max()


Yes - a median function would be perfect. But, I was also planning to make Upper Quartile and Lower Quartile calculations using a variation of my formula. Would it be possible to add also a Quartile function?

@Xiphware and @LN is there a way that I can boost this? To simplify the requirement is for a median() and quartile() function.