grouping by closest ancestor

View: New views
3 Messages — Rating Filter:   Alert me  

grouping by closest ancestor

by Sergio Andreozzi :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


Dear all,

I'm facing a problem in XQuery/XPath. I would like to ask you for some
advice. Please, consider the following XML document:

<?xml version="1.0" encoding="UTF-8"?>
<S>
        <A>
                <B>
                        <F>4</F>
                        <C>
                                <D>3</D>
                                <E>5</E>
                                <G>
                                        <H>3</H>
                                </G>
                                <G>
                                        <H>2</H>
                                </G>
                        </C>
                </B>
                <B>
                        <F>2</F>
                        <C>
                                <E>2</E>
                                <G>
                                        <H>5</H>
                                </G>
                                <G>
                                        <H>4</H>
                                </G>
                        </C>
                        <C>
                                <D>7</D>
                                <E>2</E>
                        </C>
                </B>
        </A>
        <A>
                <B>
                        <F>3</F>
                        <C>
                                <D>3</D>
                                <E>2</E>
                        </C>
                        <C>
                                <D>5</D>
                                <E>2</E>
                        </C>
                </B>
        </A>
        <A>
                <B>
                        <F>2</F>
                        <C>
                                <D>5</D>
                                <E>2</E>
                        </C>
                </B>
        </A>
</S>

given a for clause like this: for $A in doc ("doc.xml")/S/A
as an example, I would like to work on the result of the following XPath
expressions:

$A/B/F ...
$A/B/C/D ...
$A/B/C/E ...
$A/B/C/G/H ...

but I need to have the results reorganized in such a way that I can
create groups based on the closest common ancestor (per each pair of
elements) as follows:

first A element, the XPath queries return:

$A/B/F     = (4,2)
$A/B/C/D   = (3,7)
$A/B/C/E   = (5,2,2)
$A/B/C/G/H = (3,2,5,4)

a possible refatctoring of the result is ( _ can be replaced with 0 ):

$A/B/F     = (4,4,2,2,2)
$A/B/C/D   = (3,3,_,_,7)
$A/B/C/E   = (5,5,5,5,2)
$A/B/C/G/H = (3,2,5,4,_)

In this result, considering each column, every pair of values refers to
the elements which have the closest ancestor (among all the elements
with the same QName part of the XPath sequence result). For instance:

col 1, row 1: F=4
col 1, row 4: H=3

they have the first B element as closest ancestor. Conversely, in the
generated result, I don't have H=3 coupled with F=2 as they have A as
closest ancestor. A is farer than the common ancestor between H=3 and
F=4 (the first B).

The idea is to generate all the possible tuples (read by column in my
proposal), one value for each element, but valid tuples are those which
have the closest ancestor (considering elements in pair). Missing values
can be filled with 0.

In the remaining part you can find refactoring of the result for the
other A elements:

first A element, the XPath queries return:

$A/B/F   = (3)
$A/B/C/D = (3,5)
$A/B/C/E = (2,2)

I would like something like this:

$A/B/F   = (3,3)
$A/B/C/D = (3,5)
$A/B/C/E = (2,2)

first A element, the XPath queries return:

$A/B/F   = (2)
$A/B/C/D = (5)
$A/B/C/E = (2)

that's fine.

I would appreciate any suggestion or guidelines on how to generate the
results constrained as explained above. I hope that the problem
description is enough clear, otherwise I can provide more details.

Regards, Sergio



RE: grouping by closest ancestor

by Michael Kay-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


I assume you've got the answer you wanted over on talk@..., which is
proving a rather more useful forum for such questions.

Michael Kay
 

> -----Original Message-----
> From: www-ql-request@... [mailto:www-ql-request@...] On
> Behalf Of Sergio Andreozzi
> Sent: 07 December 2005 16:40
> To: www-ql@...
> Subject: grouping by closest ancestor
>
>
> Dear all,
>
> I'm facing a problem in XQuery/XPath. I would like to ask you for some
> advice. Please, consider the following XML document:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <S>
> <A>
> <B>
> <F>4</F>
> <C>
> <D>3</D>
> <E>5</E>
> <G>
> <H>3</H>
> </G>
> <G>
> <H>2</H>
> </G>
> </C>
> </B>
> <B>
> <F>2</F>
> <C>
> <E>2</E>
> <G>
> <H>5</H>
> </G>
> <G>
> <H>4</H>
> </G>
> </C>
> <C>
> <D>7</D>
> <E>2</E>
> </C>
> </B>
> </A>
> <A>
> <B>
> <F>3</F>
> <C>
> <D>3</D>
> <E>2</E>
> </C>
> <C>
> <D>5</D>
> <E>2</E>
> </C>
> </B>
> </A>
> <A>
> <B>
> <F>2</F>
> <C>
> <D>5</D>
> <E>2</E>
> </C>
> </B>
> </A>
> </S>
>
> given a for clause like this: for $A in doc ("doc.xml")/S/A
> as an example, I would like to work on the result of the
> following XPath
> expressions:
>
> $A/B/F ...
> $A/B/C/D ...
> $A/B/C/E ...
> $A/B/C/G/H ...
>
> but I need to have the results reorganized in such a way that I can
> create groups based on the closest common ancestor (per each pair of
> elements) as follows:
>
> first A element, the XPath queries return:
>
> $A/B/F     = (4,2)
> $A/B/C/D   = (3,7)
> $A/B/C/E   = (5,2,2)
> $A/B/C/G/H = (3,2,5,4)
>
> a possible refatctoring of the result is ( _ can be replaced with 0 ):
>
> $A/B/F     = (4,4,2,2,2)
> $A/B/C/D   = (3,3,_,_,7)
> $A/B/C/E   = (5,5,5,5,2)
> $A/B/C/G/H = (3,2,5,4,_)
>
> In this result, considering each column, every pair of values
> refers to
> the elements which have the closest ancestor (among all the elements
> with the same QName part of the XPath sequence result). For instance:
>
> col 1, row 1: F=4
> col 1, row 4: H=3
>
> they have the first B element as closest ancestor. Conversely, in the
> generated result, I don't have H=3 coupled with F=2 as they have A as
> closest ancestor. A is farer than the common ancestor between H=3 and
> F=4 (the first B).
>
> The idea is to generate all the possible tuples (read by column in my
> proposal), one value for each element, but valid tuples are
> those which
> have the closest ancestor (considering elements in pair).
> Missing values
> can be filled with 0.
>
> In the remaining part you can find refactoring of the result for the
> other A elements:
>
> first A element, the XPath queries return:
>
> $A/B/F   = (3)
> $A/B/C/D = (3,5)
> $A/B/C/E = (2,2)
>
> I would like something like this:
>
> $A/B/F   = (3,3)
> $A/B/C/D = (3,5)
> $A/B/C/E = (2,2)
>
> first A element, the XPath queries return:
>
> $A/B/F   = (2)
> $A/B/C/D = (5)
> $A/B/C/E = (2)
>
> that's fine.
>
> I would appreciate any suggestion or guidelines on how to generate the
> results constrained as explained above. I hope that the problem
> description is enough clear, otherwise I can provide more details.
>
> Regards, Sergio
>
>
>




Parent Message unknown Re: grouping by closest ancestor

by Sergio Andreozzi :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


Michael Kay wrote:
> I assume you've got the answer you wanted over on talk@..., which is
> proving a rather more useful forum for such questions.

yes, indeed I found out the other list to be a more suitable place for
this kind of questions.

Regards, Sergio

LightInTheBox - Buy quality products at wholesale price!