xsl-list
[Top] [All Lists]

[xsl] XQuery/XPath 3.1: Node List to Node Set ("distinct nodes")

2021-12-28 13:09:56
I couldn’t find an answer in my google and markmail searching so I thought I’d 
ask here:

Given an arbitrary list of nodes that may contain duplicates, what is the most 
efficient way to reduce the node list to a set?

The solution I came up with is a recursive function:

(:
Get the unique nodes from the supplied sequence
@param nodes The sequence of nodes to evaluate
@return A sequence of nodes such that each node in $nodes exists exactly once.
:)
declare function dutils:distinctNodes($nodes as node()*) as node()* {
  dutils:_getDistinctNodes($nodes, ())
};

declare function dutils:_getDistinctNodes($nodes as node()*, $resultList as 
node()*) as node()* {
  if (exists($nodes))
  then
  let $node := head($nodes)
  return dutils:_getDistinctNodes(tail($nodes), ($resultList | $node))
  else $resultList

};

Which works but I feel like I’m missing some obvious way to do this more 
directly, but I’m not seeing it.

Am I missing a better solution?

Thanks,

Eliot

_____________________________________________
Eliot Kimber
Sr Staff Content Engineer
O: 512 554 9368
M: 512 554 9368
servicenow.com<https://www.servicenow.com>
LinkedIn<https://www.linkedin.com/company/servicenow> | 
Twitter<https://twitter.com/servicenow> | 
YouTube<https://www.youtube.com/user/servicenowinc> | 
Facebook<https://www.facebook.com/servicenow>
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--
<Prev in Thread] Current Thread [Next in Thread>