November 13
XPath 2.0 Gems: Find all duplicate values in a sequence
Someone recently asked the following question:
"I have an XPath expression which provides me a sequence of values like the one below:
1 2 2 3 4 5 5 6 7
It is easy to convert this to a set of unique values "1 2 3 4 5 6 7" using the distinct-values function. However, what I want to extract is the list of duplicate values = "2 5". I can't think of an easy way to do this.
Can anyone help?"
One of the best XPath/XSLT experts, whom I greatly respect, provided the following answer:
"What about:
distinct-values(
for $item in $seq
return if (count($seq[. eq $item]) > 1)
then $item
else ())
This iterates through the items in the sequence, and returns the item if the number of items in the sequence that are equal to that item is greater than one. You then have to use distinct-values() to remove the duplicates from that list."
Can you do better?
My own solution is a 21 chars one-liner, and would only be slightly longer, if efficiency would need to be addressed.