[xquery-talk] Roman numeral kata in XQuery

Andrew Welch andrew.j.welch at gmail.com
Thu May 12 00:37:48 PDT 2011

On 12 May 2011 01:51, Mattio Valentino <mattio.valentino at gmail.com> wrote:
> Hello,
> I hope this isn't too odd of a request.
> I wanted a little XQuery practice so I decided to try to port some
> code katas. I did the Roman numeral one first.
> Would anyone mind reviewing the solution I have here?
> http://bitbucket.org/mattio/xquery-katas/src/5ffd02da6f83/src/roman-numerals.xq

Looks good to me.

There are a couple of small things:

- you could use eq instead of = when comparing single items, eg $input
eq 'M'.  This will cause an exception if for some reason either side
becomes a sequence of multiple items instead of a single one...
whereas the set operator '=' will just carry on working and is likely
to produce incorrect results.

- you could use the 'as' to type your variables: let $numbers as
xs:integer+ := ....

An alternative to the if-then-else that you ask about could be done like this:

declare variable $letters as xs:string+ := ('I', 'V', 'X', 'L', 'C', 'D', 'M');
declare variable $numbers as xs:integer+ := (1,5,10,50,100,500,1000);

($numbers[index-of($letters, 'I')], 0)[1]

The two sequences are global variables so they only get created once,
and then you use the position (index-of) of the letter in its sequence
to get the corresponding number.  The ( ...., 0)[1] is a common way of
defaulting to a value (zero here) if the first part returns nothing.


Andrew Welch

More information about the talk mailing list