Subject:Getting recursion return type right Author:Lee Humphries Date:20 Sep 2005 08:09 AM
I'm probably going about this all wrong...
Anyway. I have this recursive function which I want to return 0 or more nodes that meet a particular criteria. Only problem is it keeps on telling me that the Return value does not match the function signature.
Any ideas?
declare function local:followingSeg($Seg as node()) as node()*
{
(: Output the following node if it does not have an eXcluded status :)
for $followingSeg in $Seg/following::*[1]
where $followingSeg/@status != 'X'
return local:segOutput($Seg/following::*[1]),
(: Recurse if the following node was not Mandatory or Required :)
if (exists($Seg/following::*[1][@status = 'M' or @status = 'R'])) then ''
else local:followingSeg($Seg/following::*[1])
};
Subject:Getting recursion return type right Author:(Deleted User) Date:20 Sep 2005 08:44 AM
Hi Lee,
assuming that local:segOutput too has a signature of node()*, the error is in the instruction "then ''" that returns an empty string; you should change it to be "then ()" that returns an empty sequence.
Subject:Getting recursion return type right Author:Lee Humphries Date:20 Sep 2005 08:37 PM
Thanks Alberto,
I just couldn't find what the 'empty node' syntax was in the w3 XQuery spec anywhere (probably still can't). However, now that I've changed the "then ''" to a "then ()" I get a "SequenceType matching failed" error.
Any further ideas?
PS. I'm still using Stylus 5.3, so this could be a "it's time to upgrade" issue.
Subject:Getting recursion return type right Author:Lee Humphries Date:20 Sep 2005 09:52 PM
Well I got an eval copy of v6 and that wasn't the issue - However I did find the problem, I wasn't testing for when there were absolutely no more following nodes. So the function ended up as:
declare function local:followingSeg($Seg as node()) as node()*
{
(: Output the following node if it does not have an eXcluded status :)
for $followingSeg in $Seg/following::*[1]
where $followingSeg/@status != 'X'
return local:segOutput($Seg/following::*[1]),
(: Recurse if the following node was not Mandatory or Required :)
if (exists($Seg/following::*[1][@status = 'M' or @status = 'R'])) then ()
else if (count($Seg/following::*[1]) = 0) then ()
else local:followingSeg($Seg/following::*[1])
};
Who in their infinite wisdom decided that XQuery didn't need a switch/select/case/xsl:choose/etc. that's what I want to know -ME- (Mumbling expletives).