Re: [xsl] Algorithm for determining ranges

Subject: Re: [xsl] Algorithm for determining ranges
From: "Martin Honnen martin.honnen@xxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Fri, 5 Jun 2026 14:56:51 -0000
On 05/06/2026 16:47, rick@xxxxxxxxxxxxxx wrote:
>
> Hi Martin,
>
> The last number is where the ranges should be. Thank you.
>
>
>
>     I need to determine ranges, like this:
>
>     <?xml version="1.0" encoding="UTF-8"?>
>     <xrefs>
>     B B B  <xref>16.1.0</xref>
>     B B B  <xref>16.2.1</xref>
>     B B B  <range/>
>     B B B  <xref>16.2.3</xref>
>     B B B  <xref>16.14.2</xref>
>     B B B  <xref>16.22.0</xref>
>     </xrefs>
>
>     I am trying to determine an XSLT 3.0 algorithm for doing this. I
>     am looking for suggestions. Thank you in advance.
>

For the test sample

 B  <xsl:template match="xrefs">
 B  B  <xsl:copy>
 B  B  B  <xsl:for-each-group select="xref" group-adjacent="let $numbers :=
tokenize(., '\.') ! xs:integer(.) return
string-join(($numbers[position() lt last()], $numbers[last()] -
position() + 1), '.')">
 B  B  B  B  <xsl:choose>
 B  B  B  B  B  <xsl:when test="current-group()[3]">
 B  B  B  B  B  B  <xsl:sequence select="current-group()[1]"/>
 B  B  B  B  B  B  <range/>
 B  B  B  B  B  B  <xsl:sequence select="current-group()[3]"/>
 B  B  B  B  B  </xsl:when>
 B  B  B  B  B  <xsl:otherwise>
 B  B  B  B  B  B  <xsl:sequence select="current-group()"/>
 B  B  B  B  B  </xsl:otherwise>
 B  B  B  B  </xsl:choose>
 B  B  B  </xsl:for-each-group>
 B  B  </xsl:copy>
 B  </xsl:template>

would do.

Not sure whether at some point e.g. 16.2.9 and 16.3.0 would form a range.

Current Thread