[xquery-talk] Partitioning data with XQuery
Howard Katz
howardk at fatdog.com
Tue Apr 26 19:13:42 PDT 2005
Also lovely. Thank you, Mike. Positional grouping, indeed. It's always
enjoyable learning something new.
Howard
> -----Original Message-----
> From: talk-bounces at xquery.com [mailto:talk-bounces at xquery.com]On Behalf
> Of Michael Kay
> Sent: Tuesday, April 26, 2005 1:19 AM
> To: howardk at fatdog.com; 'xquery-talk'
> Subject: RE: [xquery-talk] Partitioning data with XQuery
>
>
> In the XSLT world this problem is known as "positional grouping"
> and it may
> be worth googling for that to see whether any of the established
> techniques
> used with XSLT 1.0 are applicable with XQuery.
>
> In XSLT 2.0 the problem becomes easy:
>
> <xsl:template match="record">
> <xsl:for-each-group select="*"
> group-starting-with="subRecordStart">
> <record>
> <xsl:copy-of select="remove(current-group(), 1)"/>
> </record>
> </xsl:for-each-group>
> </xsl:template>
>
> In XSLT 1.0 there were two techniques generally used for the general
> problem. The first was to turn it into a value-based grouping
> problem, but
> this relies on the generate-id() function which returns a
> representation of
> the node identity as a string, which isn't available in XQuery. The other
> technique is to recurse over the sibling axis, typically using
> xsl:apply-templates. Assuming that your XQuery implementation offers the
> following-sibling axis (life gets really hard if it doesn't...) you can
> still do this recursive scan though the coding is a bit different.
>
> However, in your case the problem is a lot easier than the general
> positional grouping problem because you know that there are exactly two
> sub-records. This means you can do something like:
>
> let $first := subRecordStart[1],
> $second := subRecordStart[2]
> return (
> <record>{*[. >> $first and . << $second]}</record>,
> <record>{*[. >> $$second]}</record>
>
> Michael Kay
>
> > -----Original Message-----
> > From: talk-bounces at xquery.com
> > [mailto:talk-bounces at xquery.com] On Behalf Of Howard Katz
> > Sent: 26 April 2005 00:30
> > 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
> >
>
>
> _______________________________________________
> talk at xquery.com
> http://xquery.com/mailman/listinfo/talk
>
More information about the talk
mailing list