XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
Lee HumphriesSubject: 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])
};

Postnext
Alberto MassariSubject: Getting recursion return type right
Author: Alberto Massari
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.

Hope this helps,
Alberto

Postnext
Lee HumphriesSubject: 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.

Regards, Lee

Posttop
Lee HumphriesSubject: 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).

 
Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2016 All Rights Reserved.