- From: Per Bothner <per@bothner.com>
- Date: Tue, 09 Mar 2004 17:39:09 -0800
- To: Chen Yabing <iscp0054@nus.edu.sg>
- Cc: www-ql@w3.org
Chen Yabing wrote: > I am sorry that I did not present my problem clearly. Actually the > problem requires parent context. You can use parent context explicitly (e.g. the parent:: axis), or implicitly, using recursion. The latter is probably more efficient. Whether it's easier I don't know; I show a solution using recursion below. > 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. This is still not very clear, and it's a rather weird problem. However. this solution gives the desired result. declare function convert-children ($x) { for $y in $x/node() return convert-node($y) }; declare function strip-children ($x) { for $y in $x/node() where ($y[@dno="d002"] or not($y instance of element(d,*))) return $y }; declare function convert-node($x) { if ($x instance of element() and $x/d[@dno="d002"]) then element {node-name($x)} {$x/@*, strip-children($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-node()) then document {convert-children($x)} else () }; convert-node(doc("/tmp/dd.xml")) yields (using the CVS version of Qexo) the desired result. -- --Per Bothner per@bothner.com http://per.bothner.com/
Received on Tuesday, 9 March 2004 20:39:14 UTC