xsl-list
[Top] [All Lists]

RE: number collapsing

2004-12-14 06:59:40
One observation:

       <xsl:when test="$begin castable as xs:integer">
         <xsl:variable name="begin2" select="$begin" as="xs:integer"/>

This may fail if $begin is a string. The string "123" is castable to
xs:integer, but not assignable to xs:integer. Better to write the second
line as 

<xsl:variable name="begin" select="xs:integer($begin)" as="xs:integer"/>

to force the cast.

My personal preference is always to use the "as" attribute on xsl:param to
make it clear what type of argument you are expecting. This will lead to
much more comprehensible error messages if (when) you get it wrong.

I think your new problem can be tackled using a "group-starting-with". The
only problem is that this requires nodes rather than atomic values. So we'll
start by putting the numbers into a temporary tree:

<xsl:function name="f:ranges" as="xs:string">
  <xsl:param name="pagelist" as="xs:integer*"/>
  <xsl:variable name="tree">
    <xsl:for-each select="$pagelist">
      <page nr="{.}"/>
    </xsl:for-each>
  </xsl:variable>
  <xsl:variable name="ranges" as="xs:string*">
    <xsl:for-each-group select="$pagelist/page"
           group-starting-with="page[(_at_)nr ne preceding-sibling::page[1]/@nr 
+
1]">
      <xsl:sequence select="
         if (count(current-group()) eq 1) 
         then string(@nr)
         else concat(string(@nr), '-',
string(current-group()[last()]/@nr))"/>
    </xsl:for-each-group>
  </xsl:variable>
  <xsl:value-of>[<xsl:value-of select="$ranges" separator=",
"/>]</xsl:value-of>
</xsl:function>

Another nice grouping use case.

Not tested!

Michael Kay
http://www.saxonica.com/


-----Original Message-----
From: Bruce D'Arcus [mailto:bdarcus(_at_)myrealbox(_dot_)com] 
Sent: 14 December 2004 12:39
To: XSL-List(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] number collapsing

Awhile back I got help from the list working on a function to 
collapse 
page numbers (e.g. 455-456 becomes 455-56).*

I now have a related issue, which I'm now sure how to tackle:

In numeric style citations, the in-text markers look like 
[1].  If one 
has multiple references, then, you'd get [1, 2, 3].

So how can I get [1-3] or (in some cases)  [1-3, 5]?

Bruce

* here it is:

   <xsl:function name="bib:number-condense">
     <xsl:param name="begin"/>
     <xsl:param name="end"/>
     <xsl:choose>
       <xsl:when test="$begin castable as xs:integer">
         <xsl:variable name="begin" select="$begin" as="xs:integer"/>
         <xsl:choose>
           <xsl:when test="$begin gt 100 and $begin mod 100 
and $begin 
idiv 100 eq $end idiv 100">
             <xsl:value-of select="$end mod 100"/>
           </xsl:when>
           <xsl:otherwise>
             <xsl:value-of select="$end"/>
           </xsl:otherwise>
         </xsl:choose>
       </xsl:when>
       <xsl:otherwise>
         <xsl:value-of select="$end"/>
       </xsl:otherwise>
     </xsl:choose>
   </xsl:function>


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



<Prev in Thread] Current Thread [Next in Thread>