- From: Chen Yabing <iscp0054@nus.edu.sg>
- Date: Mon, 8 Mar 2004 11:19:53 +0800
- To: "Per Bothner" <per@bothner.com>, "Xavier Franc" <xfranc@online.fr>
- Cc: <www-ql@w3.org>
- Message-ID: <3630B143EA0D7246BDF7EF9FBDF6F9ABAB44B0@MBXSRV26.stu.nus.edu.sg>
Per Bothner wrote:
>Chen Yabing's problem doesn't require parent context, so it
>can be simply expressed without "matching", though because
>he does need to match type attributes he can't just use
>typeswitch. I'm not sure I understand the problem correctly,
>but would something like this work?
>declare function convert-children ($x) {
> for $y in $x/node() return convert-node($y)
>};
>declare function convert-node($x) {
> if ($x instance of element(d,*) and $x[@dno="d002"])
> then $x
> else if ($x instance of element() and $x//d[@dno="d002"])
> then element {node-name($x)} {$x/@*, convert-children($x)}
> else if ($x instance of document())
> then document {convert-children($x)}
> else () };
I am sorry that I did not present my problem clearly. Actually the problem requires parent context.
Let’s say, if the query finds an element d which has only one instance with dno≠"d002", then the query should remove all parent and child instances of the instance of d. On the other hand, if the query finds an element d which has instance with dno="d002" and other instances, then only removes the other instances and keep the parent and child instances of the instance of d.
Say the source is
<a ano=”a001”>
<b bno=”b001”>
<c cno=”c001”/>
<d dno=”d001”/>
<d dno=”d002”/>
</b>
<b bno=”b002”>
<c cno=”c002”/>
<d dno=”d001”/>
</b>
</a>
Then the query result should be
<a ano=”a001”>
<b bno=”b001”>
<c cno=”c001”/>
<d dno=”d002”/>
</b>
</a>
Received on Sunday, 7 March 2004 22:20:15 UTC