You might also someday be interested in the inverse function (roman numeral to decimal); here is what we use. It might be interesting for the group to compare the iterative approach here with the recursive approach to a similar problem in Ken's version?

-Mike

declare namespace ifp="http://www.ifactory.com/press";;

define function ifp:roman-number-to-decimal ($roman-number as xs:string)
{
  let $roman-tokens := <roman-tokens>
<tok sym='M'>1000</tok>
<tok sym='D'>500</tok>
<tok sym='C'>100</tok>
<tok sym='L'>50</tok>
<tok sym='X'>10</tok>
<tok sym='V'>5</tok>
<tok sym='I'>1</tok>
</roman-tokens>
  let $l := string-length($roman-number)
  return  sum (
    for $i in (0 to $l - 1)
      let $t := substring($roman-number, $l - $i, 1)
      let $s := substring($roman-number, $l - $i + 1, 1)
      let $tv := number($roman-tokens/tok[@sym=$t])
      let $sv := number($roman-tokens/tok[@sym=$s])
    return if ($sv and $sv gt $tv) then $tv * -1 else number($tv)
  )
};


On 11/17/2011 2:11 PM, G. Ken Holman wrote:
Below is what I use in the classroom for Roman numerals for a limited set of numbers.

For your alpha numbers I would work with codepoints-to-string() ... but it isn't something I've already done.

I hope this helps.

. . . . . . . . . . . Ken

xquery version "1.0";

(:
A library to transform a number less than 4000 to a sequence of Roman digits.

  Crane Softwrights Ltd. XQuery Training
:)

module namespace n2r = "urn:X-Crane:n2roman";

(:the basis of transformation is a series of strings for components:)
declare variable $n2r:values as element(value)+ :=
(
<value num="1"    char="I" />,
<value num="4"    char="IV"/>,
<value num="5"    char="V" />,
<value num="9"    char="IX"/>,
<value num="10"   char="X" />,
<value num="40"   char="XL"/>,
<value num="50"   char="L" />,
<value num="90"   char="XC"/>,
<value num="100"  char="C" />,
<value num="400"  char="CD"/>,
<value num="500"  char="D" />,
<value num="900"  char="CM"/>,
<value num="1000" char="M" />
);

(:return the concatenation of strings by continuous reduction:)
declare function n2r:n2roman ( $num as xs:integer ) as xs:string
{
  (:as long as we have a number, keep going:)
  if ( $num ) then
    (:reduce by the largest number that has a string value:)

    for $val in $n2r:values[@num <= $num][fn:last()] return
      (:using the highest value:)
fn:concat( $val/@char,n2r:n2roman( $num - xs:integer( $val/@num ) ) )
  (:nothing left:)
  else ""
};

(:end of file:)

At 2011-11-17 14:04 -0500, Joe Wicentowski wrote:
Hi all,

I am constructing a table of contents based on a TEI document (whose
structure consists primarily of nested divs), and would like to be
able to generate appropriate heading levels for each the table of
contents hierarchy.  Specifically, I want to be able to generate the
"I", "II", "A", "B", and "a" bits in:

I. Chapter 1
II. Chapter 2
  A. Section 1
  B. Section 2
    a) Subsection 1

Put another way, borrowing from CSS terminology, I need to be able to
format an integer as "upper-roman", "upper-alpha", and "lower-alpha."

Borrowing from XSL terminology, I need to perform the equivalent
function of <xsl:number>, as in:

<xsl:number value="2" format="I'/> ==> returns "II"
<xsl:number value="2" format="a'/> ==> returns "b"
<xsl:number value="2" format="A'/> ==> returns "B"

I think what I really need is XPath 3.0's fn:format-integer()
function[1], but it appears that XPath 3.0 is still at the Working
Draft stage.

So my question: Of course I could hack my own format-integer()
function together (indeed, my current kludge is to pipe out my
integers to an XSL stylesheet), but is there an XPath or XQuery
library that would let me do this?

Thanks,
Joe

[1] http://www.w3.org/TR/xpath-functions-30/#func-format-integer


--
Contact us for world-wide XML consulting and instructor-led training
Free 5-hour video lecture: XSLT/XPath 1.0 & 2.0 http://ude.my/t37DVX
Crane Softwrights Ltd.            http://www.CraneSoftwrights.com/q/
G. Ken Holman                   mailto:[email protected]
Google+ profile: https://plus.google.com/116832879756988317389/about
Legal business disclaimers:    http://www.CraneSoftwrights.com/legal

_______________________________________________
[email protected]
http://x-query.com/mailman/listinfo/talk

_______________________________________________
[email protected]
http://x-query.com/mailman/listinfo/talk

Reply via email to