Re: how to write such xquery?
Per Bothner <[email protected]>
| Newsgroups | gmane.comp.web.query-languages |
|---|---|
| Message-ID | <[email protected]> |
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.
> Lets 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
[email protected] http://per.bothner.com/