Subject:"for" clause question Author:Eugene Kirin Date:06 Jul 2005 06:49 AM
Hello! Please help me to resolve next problem:
I have got a xml file (please look attach) where
item element can be nested N times. I desperately tried to write recursion function, but without effect. Can you suggest me how better to realize recursion with xquery?
I can not realize this function cause I always get error "SequenceType matching failed: the sequence contains more than one item [err:XP0006]" when execute xquery:
-------------------
declare namespace gb="http://maven.ru/guidebooks/xquery";
(:reads toc items:)
declare function gb:tocItem($x as node())
as node() {
for $item in $x/item
return $item
};
gb:tocItem(/book/toc)
-------------------
Please point me what I do wrong.
And thanks for your responses!
Subject:"for" clause question Author:(Deleted User) Date:06 Jul 2005 08:04 AM
Hi Eugene,
the error is caused by the fact that the function is defined as returning a single node(), while it is returning a sequence of nodes.
You should change the declaration to be
declare function gb:tocItem($x as node())
as node()* {
As for the recursion, what do you want to obtain? If you want to flatten all the "item" nodes, you can use this function
declare function gb:tocItem($x as node())
as node()* {
for $item in $x/item
return
<item id="{$item/@id}">{$item/title}</item>,
for $item in $x/item
return
gb:tocItem($item)
};
or, if you prefer a depth-first navigation, this one
declare function gb:tocItem($x as node())
as node()* {
for $item in $x/item
return
(
<item id="{$item/@id}">{$item/title}</item>,
gb:tocItem($item)
)
};