- From: Peter Fankhauser <fankhaus@ipsi.fhg.de>
- Date: Mon, 18 Feb 2002 18:53:10 +0100
- To: <www-ql@w3.org>
- Message-ID: <006101c1b8a5$21263030$ad240c8d@pcpotato>
Another try with a different send-address...
Peter.
-----Original Message-----
From: Peter Fankhauser [mailto:fankhaus@infonyte.com]
Sent: Montag, 18. Februar 2002 14:56
To: 'Chen Yabing'; 'www-ql@w3.org'
Subject: RE: Combine sub elements in identical elements
It appears that you want to
depict only projects for which there exist suppliers for which there
exist
parts with a price > 110, within those projects you only want to return
suppliers
for which there exist parts with a price > 110, within those suppliers
you
only want to return the parts with a price > 110.
One way to accomplish this in XQuery is by a nested query.
FOR $j IN document("spj.xml")//project[.//price >100]
RETURN
<project jno = {$j/@jno}>
{FOR $s IN $j/supplier[.//price >100]
RETURN
<supplier sno = {$s/@sno}>
{FOR $p IN $s/part[price > 100]
RETURN
<part pno = {$p/@pno}>
{$p/price}
</part>
}
</supplier>
}
</project>
In fact, this corresponds to the (presumed) logic of your query
pretty well. If you're happy with possibly empty suppliers and
projects, you can leave out the predicates with [.//price].
Hope this clarifies,
Peter
-----Original Message-----
From: www-ql-request@w3.org [mailto:www-ql-request@w3.org] On Behalf Of
Chen Yabing
Sent: Montag, 18. Februar 2002 13:21
To: 'www-ql@w3.org'
Subject: Combine sub elements in identical elements
Hi,
it seems that XQuery cannot place elements together even if they have
same parent elements in the result. I mean that the result will produce
two identical elements for each sub elements.
For example, the source document:
<db>
<project jno="j001">
<supplier sno="s001">
<part pno="p001" >
<price>190</price>
</part>
</supplier>
<supplier sno="s002">
<part pno="p001">
<price>110</price>
</part>
</supplier>
</project>
<project jno="j002">
<supplier sno="s002">
<part pno="p002">
<price>120</price>
</part>
</supplier>
</project>
</db>
the query is:
FOR $j IN document("spj.xml")//project,
$s IN $j/supplier,
$p IN $s/part
WHERE $p/price >100
return
<project jno = {$j/@jno}>
<supplier sno = {$s/@sno}>
<part pno = {$p/@pno}>
{$p/price}
</part>
</supplier>
</project>
and the result is:
<project jno="j001">
<supplier sno="s001">
<part pno="p001">
<price>190</price>
</part>
</supplier>
</project>
<project jno="j001">
<supplier sno="s002">
<part pno="p001">
<price>110</price>
</part>
</supplier>
</project>
<project jno="j002">
<supplier sno="s002">
<part pno="p002">
<price>120</price>
</part>
</supplier>
</project>
</xql:result>
In the ideal situation, the query result should be identical to the
source document. but there are two project whose jno is "j001".
If I want to produce a result which will combine elements under the
identical parent elements together so that there are only one parent
elements. How can I do based on the above query?
Thank you!
Received on Monday, 18 February 2002 14:40:04 UTC