2.7 KiB
Function Resolvers
The methods on the XPathEvaluator type can optionally take a function resolver to resolve function references in the XPath expression being evaluated.
There are three ways to specify a function resolver and you can use any one of them depending on which is most suited to your particular situation.
Note that if your functions are in a namespace (e.g. fn:myFunction()
), you must use the second or third
type as the plain object implementation does not support namespaces.
Function implementations
Custom XPath functions are implemented as JavaScript functions taking one or more arguments.
The first argument passed in is a context object containing a number of properties relating to the execution context,
the most important being contextNode
, the context in which the function is being evaluated.
The remaining arguments are the arguments passed into the XPath function, as instances of the XPathResult
interface.
Please see the documentation on that interface for details.
As the return value, you can return a string, number, boolean, single node, or array of nodes.
Function Resolver Type 1: Plain object
A plain object with function names as the keys and function implementations as the values.
Example usage:
var evaluator = xpath.parse('squareRoot(10)');
var aboutPi = evaluator.evaluateNumber({
functions: {
'squareRoot': function (c, value) {
return Math.sqrt(value.numberValue());
}
}
});
Function Resolver Type 2: Function
A function that takes a function name as its first parameter and an optional namespace URI as its second parameter and returns a function based on the name and namespace.
Example usage:
var evaluator = xpath.parse('math:squareRoot(10)');
var aboutPi = evaluator.evaluateNumber({
functions: function (name, namespace) {
if (name === 'squareRoot' && namespace === 'http://sample.org/math/') {
return function (c, value) {
return Math.sqrt(value.numberValue());
};
}
},
namespaces: {
math: 'http://sample.org/math/'
}
});
Function Resolver Type 3: Object with getFunction
method
An object with a method named getFunction
that works in the same way as the function-based function resolver
described above.
Example usage:
var evaluator = xpath.parse('math:squareRoot(10)');
var aboutPi = evaluator.evaluateNumber({
functions: {
getFunction: function (name, namespace) {
if (name === 'squareRoot' && namespace === 'http://sample.org/math/') {
return function (c, value) {
return Math.sqrt(value.numberValue());
};
}
}
},
namespaces: {
math: 'http://sample.org/math/'
}
});