[xquery-talk] Questions on User-Defined Functions

Wei, Alice J. ajwei at indiana.edu
Sun Feb 24 09:04:20 PST 2008


Dear Michael:

   The good thing is that the errors I have had before were gone, but I wanted to have it be output as

   <statistics>229</statistics>

   and not only 229.

   Apparently, it appears that since the function is now defined as xs:integer as the output, it cannot output texts of other format. Therefore, what would you suggest for me to add the tags in?

  This is what I have come up with:

declare function local:count-distinct-values($seq as xs:anyAtomicType*)
      as xs:integer {
   count(distinct-values($seq))
};
<statistics>
{local:count-distinct-values(collection("xmldb:exist://db/cbml")//ad)}
</statistics>

Is this the way to go?

I know that this script may not be making much sense in terms of its information extraction, but this little code is probably simple enough for me to start off with to investigate further into the subject.

Alice
==============================================
Alice Wei
MIS 2008
School of Library and Information Science
Indiana University Bloomington
ajwei at indiana.edu
________________________________________
From: Michael Kay [mike at saxonica.com]
Sent: Sunday, February 24, 2008 8:21 AM
To: Wei, Alice J.
Subject: RE: [xquery-talk] Questions on User-Defined Functions

>
> I modified my code to what you suggested,
>
> declare function local:total($po as element(ad)*)
>        as xs:integer {
>     count(distinct-values($po))
> };

If you want a function that counts the number of distinct values in a
sequence, then it's best to make it work on any sequence, to maximize the
scope for reuse. I would define it as:

declare function local:count-distinct-values($seq as xs:anyAtomicType*)
       as xs:integer {
    count(distinct-values($seq))
};

There is no need to restrict the caller to supplying elements with a
particular name. Declaring the argument as xs:anyAtomicType will
automatically atomize the supplied sequence if it contains elements or other
nodes. I've also chosen what seem to me more meaningful names for the
function and its parameter.

> However, the
> number is now in superscript, and I wanted to add the
> <statistics> tags back in.

It's not the function that puts it in superscript - what you do with the
result of the function depends entirely on the calling code.
>
> I intend to create a web application out of XQuery, and I am
> not sure if user-defined functions is the way to go.

In any programming language, modularizing your code is essential as the
application gets bigger, and user-defined functions are the main way to
achieve that in XQuery. However, having a function called
count-distinct-values($x) which does exactly the same as
count(distinct-values($x)) isn't exactly a great leap of abstraction.

Michael Kay
http://www.saxonica.com/




More information about the talk mailing list