Re: [xsl] Get the duplicates in a list

Subject: Re: [xsl] Get the duplicates in a list
From: "Bauman, Syd s.bauman@xxxxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Fri, 3 Jan 2025 12:37:51 -0000
Martin & Liam b
Are there significant advantages to your suggestions over the following?

(
  ( for $f in $fieldnames return if ( count( $fieldnames[ . eq $f ] ) gt 1 )
then $f else '' )
  => distinct-values()
)[. ne '']

I admit it is not simple, but strikes me as simpler. (Note that instead of the
null string, one could use any string that is guaranteed not to be a value. I
often like bbb (U+241C) or bbb (U+2205) for this kind of thing.
One could also probably use a test on that bifb that only looked at
preceding or following values of $fieldnames, which some folks might find more
readable.)


________________________________
>
> $fieldnames is a list of strings, e.g.,
>
> ('TYPE', 'USAGE_CD', 'DIR', 'WGS_LAT', 'TYPE', 'WGS_LONG',
> 'TURN_DIR', 'DIR', 'TYPE')
>
> I want a list of the duplicates in $fieldnames:

In the qt4 draft, thhis is duplicate-values($fieldnames)

This is described as being equivalent to
<xsl:for-each-group select="$values" group-by="." collation="{
$collation }">
  <xsl:sequence select="current-group()[2]"/>
</xsl:for-each>

We could make use of document order if the values were in elements with
a common ancestor:

let $fieldnames := <f> {
  ('TYPE', 'USAGE_CD', 'DIR', 'WGS_LAT', 'TYPE', 'WGS_LONG',
   'TURN_DIR', 'DIR', 'TYPE') ! <e>{.}</e>
} </f>
return distinct-values($fieldnames/e[preceding::e = .])

Not sure if thatbs simpler than Martinbs approach, but itbs more
XSLTish maybe.

---------

With pure XPath 3.1 you could try

   let $fieldnames := ('TYPE', 'USAGE_CD', 'DIR', 'WGS_LAT', 'TYPE',
'WGS_LONG', 'TURN_DIR', 'DIR', 'TYPE'),
     $fieldnamesMap := map:merge($fieldnames!map:entry(., 1), map {
'duplicates' : 'combine' })
return map:for-each($fieldnamesMap, function($k, $v) { if ($v[2]) then
$k else ()})

Not sure whether it can be considered simple.

Current Thread