net.sf.saxon.query
Class XQueryFunctionLibrary
java.lang.Object
net.sf.saxon.query.XQueryFunctionLibrary
- FunctionLibrary, Serializable, FunctionLibrary, XQueryFunctionBinder
public class XQueryFunctionLibrary
extends java.lang.Object
An XQueryFunctionLibrary is a function library containing all the user-defined functions available for use within a
particular XQuery module: that is, the functions declared in that module, and the functions imported from other
modules. It also contains (transiently during compilation) a list of function calls within the module that have not
yet been bound to a specific function declaration.
XQueryFunctionLibrary
public XQueryFunctionLibrary(Configuration config)
Create an XQueryFunctionLibrary
config
- the Saxon configuration
bind
public Expression bind(StructuredQName functionName,
Expression[] arguments,
StaticContext env)
throws XPathException
Identify a (namespace-prefixed) function appearing in the expression. This
method is called by the XQuery parser to resolve function calls found within
the query.
Note that a function call may appear earlier in the query than the definition
of the function to which it is bound. Unlike XSLT, we cannot search forwards to
find the function definition. Binding of function calls is therefore a two-stage
process; at the time the function call is parsed, we simply register it as
pending; subsequently at the end of query parsing all the pending function
calls are resolved. Another consequence of this is that we cannot tell at the time
a function call is parsed whether it is a call to an internal (XSLT or XQuery)
function or to an extension function written in Java.
- bind in interface FunctionLibrary
- an Expression representing the function call. This will normally be
a FunctionCall, but it may be rewritten as some other expression.
XPathException
- if the function call is invalid, either because it is
an unprefixed call to a non-system function, or because it is calling a system
function that is available in XSLT only. A prefixed function call that cannot
be recognized at this stage is assumed to be a forwards reference, and is bound
later when bindUnboundFunctionCalls() is called.
copy
public FunctionLibrary copy()
This method creates a copy of a FunctionLibrary: if the original FunctionLibrary allows
new functions to be added, then additions to this copy will not affect the original, or
vice versa.
- copy in interface FunctionLibrary
- a copy of this function library. This must be an instance of the original class.
declareFunction
public void declareFunction(XQueryFunction function)
throws XPathException
Register a user-defined XQuery function
function
- the function to be registered
XPathException
- if there is an existing function with the same name and arity
explainGlobalFunctions
public void explainGlobalFunctions(ExpressionPresenter out)
Output "explain" information about each declared function
out
- the ExpressionPresenter that renders the output
fixupGlobalFunctions
protected void fixupGlobalFunctions(QueryModule env)
throws XPathException
Fixup all references to global functions. This method is called
on completion of query parsing. Each XQueryFunction is required to
bind all references to that function to the object representing the run-time
executable code of the function.
This method is for internal use.
env
- the static context for the main query body.
getConfiguration
public Configuration getConfiguration()
Get the Configuration options
getDeclarationByKey
public XQueryFunction getDeclarationByKey(String functionKey)
Get the function declaration corresponding to a given function name and arity, supplied
in the form "{uri}local/arity"
functionKey
- a string in the form "{uri}local/arity" identifying the required function
- the XQueryFunction if there is one, or null if not.
getFunctionDefinitions
public Iterator getFunctionDefinitions()
Get an iterator over the Functions defined in this module
- an Iterator, whose items are
XQueryFunction
objects. It returns
all function known to this module including those imported from elsewhere; they
can be distinguished by their namespace.
getUserDefinedFunction
public UserFunction getUserDefinedFunction(String uri,
String localName,
int arity)
Get the function with a given name and arity. This method is provided so that XQuery functions
can be called directly from a Java application. Note that there is no type checking or conversion
of arguments when this is done: the arguments must be provided in exactly the form that the function
signature declares them.
uri
- the uri of the function namelocalName
- the local part of the function namearity
- the number of arguments.
- the function identified by the URI, local name, and arity; or null if there is no such function
isAvailable
public boolean isAvailable(StructuredQName functionName,
int arity)
Test whether a function with a given name and arity is available. This supports
the function-available() function in XSLT. This method may be called either at compile time
or at run time.
- isAvailable in interface FunctionLibrary
functionName
- the QName identifying the functionarity
- The number of arguments. This is set to -1 in the case of the single-argument
function-available() function; in this case the method should return true if there is some
optimizeGlobalFunctions
protected void optimizeGlobalFunctions()
throws XPathException
Optimize the body of all global functions. This may involve inlining functions calls
setConfiguration
public void setConfiguration(Configuration config)
Set the Configuration options
config
- the Saxon configuration