[xquery-talk] XPath/XQuery equivalent of xsl:number?

Michael Sokolov sokolov at ifactory.com
Thu Nov 17 16:14:54 PST 2011


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:gkholman at CraneSoftwrights.com
> Google+ profile: https://plus.google.com/116832879756988317389/about
> Legal business disclaimers:    http://www.CraneSoftwrights.com/legal
>
> _______________________________________________
> talk at x-query.com
> http://x-query.com/mailman/listinfo/talk



More information about the talk mailing list