[xquery-talk] Optimal expression for gathering related elements

David Lee dlee at calldei.com
Tue Mar 1 10:33:21 PST 2011


I find I use this pattern frequently when I need to group multiple elements
associated with some shared identifier (say @id)
Suppose I have something like

<all>
  <drug @id="1"><text>texta</text></drug>
  <drug @id="2"> <text>textb</text></drug>
  <drug @id="3"> <text>textc</text></drug>
  <drug @id="1"> <text>textd</text></drug>
  <drug @id="2"> <text>texte</text></drug>
...


And I want to create a set of combined entries
like
<all>
   <unique_drug @id="1">
 	  <drug ><text>texta</text></drug>
         <drug > <text>textd</text></drug>
  </unique_drug>
   <unique_drug @id="2">
 	  <drug ><text>textb</text></drug>
         <drug > <text>texte</text></drug>
  </unique_drug>

..


What I do is something like this :
( typed into email, not tested ...)

for $id in  distinct-values(/all/drug/@id)
return 
     <unique_drug id="{$id}">
	{
          		for $drug in /all/drug[@id eq $id] 
		return
			<drug>{$drug/*}</drug>
            } 
</unique_drug>


What I was offhand wondering, is if there isnt something more direct (in
XQuery 1).
It seems both verbose and inefficient, although of course efficiency is a
processor issue. (maybe it makes indexes ...)
But still ... it seems it has to scan all elements to get the unique id's
then re-scan them N times to get the matching elements, 
when I can imagine a syntax which would do both at once in linear time as
opposed to (presumably) exponential time.
It seems like something a declarative expression should be able to state
succinctly.

Any suggestions ? Or am I just fantasizing 

-David




		
 

----------------------------------------
David A. Lee
dlee at calldei.com
http://www.xmlsh.org




More information about the talk mailing list