[xquery-talk] Partitioning data with XQuery

Michael Rys mrys at microsoft.com
Mon Apr 25 19:07:53 PDT 2005


Here is a generic solution:

1. Take the person that originally design the input format and publicly
humiliate him or her. This is really bad design.

2. Repeat step 1 a hundred times.

3. Then use the following XQuery expression to perform the transform:

for $r in /record/subRecordStart
return
  <record>{
    /record/node()[(. << (/record/subRecordStart[. >> $r])[1] and . >>
$r)
        or ($r is (/record/subRecordStart)[last()] and . >> $r)]
  }</record>

HTH
Michael

> -----Original Message-----
> From: talk-bounces at xquery.com [mailto:talk-bounces at xquery.com] On
Behalf
> Of Howard Katz
> Sent: Monday, April 25, 2005 4:30 PM
> To: xquery-talk
> Subject: [xquery-talk] Partitioning data with XQuery
> 
> I need to repartition some XML data using XQuery, and I can't see how
to
> do
> it. The basic data looks something like this:
> 
> <record>
>      <subRecordStart/>		(: marks start of new sub-record
:)
>      some pcdata_1
>      <someElement_1/>
>      some more pcdata_1
>      <anotherElement_1/>
>      ... etc
> 
>      <subRecordStart/>		(: marks start of new sub-record
:)
>      some more pc data_2
>      <yetAnotherElement_2/>
>      yet some more pc data_2
>      <andYetAnotherElement_2/>
>      ... etc
> </record>
> ...
> 
> The contents of each <record> consists of exactly two
<subRecordStart/>
> elements, plus some undetermined mixture of elements and text nodes.
Each
> <record> needs to be replaced by two new <record> elements formed by
> partioning its contents into two parts. The place where each new
record is
> to begin is indicated by a <subRecordStart/> marker, with the first
> <subRecordStart/> marker being the first element child of <record>.
Other
> than that and the fact there are exactly two markers per record, the
rest
> of
> the contents are not known in advance.
> 
> On application of the appropriate XQuery, the single record above
would be
> replaced by the following two:
> 
> <record>
>      some pcdata_1
>      <someElement_1/>
>      some more pcdata_1
>      <anotherElement_1/>
> </record>
> <record>
>      some more pc data_2
>      <yetAnotherElement_2/>
>      yet some more pc data_2
>      <andYetAnotherElement_2/>
> </record>
> 
> This doesn't look difficult, but a solution eludes me. Can somebody
> suggest
> an XQuery that would be able to do this?
> TIA,
> Howard
> 
> 
> _______________________________________________
> talk at xquery.com
> http://xquery.com/mailman/listinfo/talk



More information about the talk mailing list