|
Subject: RE: [xsl] number collapsing From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Tue, 14 Dec 2004 13:59:40 -0000 |
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[@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@xxxxxxxxxxxxx]
> Sent: 14 December 2004 12:39
> To: XSL-List@xxxxxxxxxxxxxxxxxxxxxx
> 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>
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] number collapsing, David Carlisle | Thread | Re: [xsl] number collapsing, Bruce D'Arcus |
| RE: [xsl] Free XSL editors, Jim Neff | Date | [xsl] Test for leaf node, Robert Soesemann |
| Month |