Converting the Result of a Java Extension Function
This section explains how the value returned by a Java extension function is converted to an XPath value. The same rules are used in converting a Java object supplied as a parameter to a stylesheet or query.
The result of the method is converted to an XPath value as follows.
-
If the method returns void, then:
- If the option
?void=this
was present in the namespace URI of the function name, and the method is an instance-level (non-static) method, then the return value is the value of the first argument, that is, the Java object to which the method was applied, wrapped as an external Java object. - Otherwise, the return value is an empty sequence.
- If the option
-
If the method returns null, the XPath value is an empty sequence.
-
If the method is a constructor, the XPath value is of type "wrapped Java object". The only way of using this is by passing it to another external function, or by converting it to one of the standard XPath data types as described above.
Note that calling
ArrayList.new()
will result in a wrappedArrayList
object. By constrast, calling a method that returns anArrayList
will result in an XPath sequence whose items are constructed by converting the members of the returnedArrayList
. -
If the returned value is a Java boolean or Boolean, the XPath result is a boolean.
-
If the returned value is a Java double or Double, the XPath result is a double.
-
If the returned value is a Java float or Float, the XPath result is a float.
-
If the returned value is a Java int, short, long, character, or byte, or one of their object wrapper equivalents, the XPath result is an integer.
-
If the returned value is a Java String, the XPath result is a string.
-
If the returned value is an instance of the Saxon class
net.sf.saxon.om.NodeInfo
(a node in a Saxon tree), the XPath value will be a sequence containing a single node. -
If the returned value is an instance of
javax.xml.transform.Source
(other than aNodeInfo
), a tree is built from the specifiedSource
object, and the root node of this tree is returned as the result of the function. -
If the returned value is an instance of the Saxon class
net.sf.saxon.om.Sequence
, the returned value is used unchanged. -
If the returned value is is an instance of the Saxon class
net.sf.saxon.om.SequenceIterator
(an iterator over a sequence), the XPath value will be the sequence represented by this iterator. It is essential that this iterator properly implements the methodgetAnother()
which returns a new iterator over the same sequence of nodes or values, positioned at the start of the sequence. -
If the returned value is an instance of the Java class
java.util.Collection
, or if it is an array, the XPath value will be the sequence represented by the contents of thisCollection
or array. The members of the collection or array will each be converted to an XPath value, as if each member was supplied from a separate function call. An error is reported if the result contains a list or array nested within another list or array. The contents of the list or array are copied immediately on return from the function, so the originalList
or array object itself may be safely re-used. -
If the returned value is a DOM Node, and it is recognized as a wrapper around a Saxon node, then the node is unwrapped and the underlying Saxon node is returned. If the returned value is some other kind of DOM Node, then a Saxon wrapper is added. (This is an imperfect solution, since it can lead to problems with node identity and document order.)
-
If the returned value is a DOM
NodeList
, the list of nodes is returned as a Saxon node-set. Each node is handled in the same way as a Node that is returned directly as the result. -
If the result is any other Java object (including null), it is returned as a "wrapped Java object". It is also possible to force the result to be returned as a wrapped Java object by making the function call in the initializer of a variable with an appropriate type declaration. The required type for a wrapped object of Java class
java.util.Map
is written using the QNamejt:java.util.Map
, where the namespace prefixjt
represents the namespacehttp://saxon.sf.net/java-type
.