From: Jan S. <zu...@po...> - 2015-05-22 12:27:26
|
Hi all, I am trying to use XQilla 2.3.0 with xerces 3.1.1. with ICU. But, I can't use external functions in XQilla 2.3.0 even though in XQilla 2.2.0 it was possible. After migration to new XQilla the external function binding is lost... ? It seems so. I have simple full code below. If I ran this code using XQilla 2.3.0 I got exception: what: [External function '{http://schemas.csas.cz/mw/}ex_normalizeDate (http://schemas.csas.cz/mw/%7Dex_normalizeDate)' with 2 argument(s) has not been bound to an implementation] where: [parseAllToMap] xquery: [:2:1] xqilla: [src/functions/XQUserFunction.cpp:256] I know that XQilla can;t find binding, but instanace of function is binded to context using addExternalFunction.. which is used by parse method in next step. I do not know, why this is not working - If I compile this code with XQilla 2.2.0, everything is going fine. What has been changed in XQ 2.3.0 ? How can I use it now ? Thank you, Jan according to wiki help: http://xqilla.sourceforge.net/ExternalFunctionFAQ THE PROBLEMATIC CODE: #include <iostream> #include <sstream> #include <fstream> #include <stdio.h> //Xqilla #include <xqilla/xqilla-simple.hpp> #include <xqilla/functions/ExternalFunction.hpp> #include <xqilla/framework/XPath2MemoryManagerImpl.hpp> #include <xqilla/utils/XPath2Utils.hpp> #include <xqilla/exceptions/XQillaException.hpp> #include <xqilla/exceptions/XMLParseException.hpp> #include <xqilla/context/ItemFactory.hpp> #include <xqilla/ast/XQGlobalVariable.hpp> #include <xqilla/xerces/XercesConfiguration.hpp> XERCES_CPP_NAMESPACE_USE using namespace std; class MyFunction : public ExternalFunction { public: MyFunction(XPath2MemoryManager *mm) : ExternalFunction(X("http://schemas.csas.cz/mw/"), X("ex_ normalizeDate"),2 , mm) { } virtual Result execute(const Arguments *args, DynamicContext *context) const { return args->getArgument(0, context); } }; int main(int argc, char *argv[]) { // Initialise Xerces-C and XQilla by creating the factory object XQilla xqilla; try { XercesConfiguration xercesConf; XQillaConfiguration *cfXerces = &xercesConf; DynamicContext* context_q(xqilla.createContext(XQilla::XQUERY, cfXerces/* cfXqilla*/)); MyFunction nd(context_q->getMemoryManager()); context_q->addExternalFunction(&nd); // Parse an XQuery expression // (AutoDelete deletes the object at the end of the scope) AutoDelete<XQQuery> query(xqilla.parse(X("declare namespace mw = \"http:// schemas.csas.cz/mw/\";\ndeclare function mw:ex_normalizeDate($a as xs: string, $b as xs:string*) as item()* external;\nmw:ex_normalizeDate(\"a\",\" b\")"), context_q)); return 0; } catch(XQException& e) { std::ostringstream serr; serr << "what:\t[" << UTF8(e.getError()) << "]" << std::endl \ << "where:\t[parse]" << std::endl \ << "xquery:\t[" << UTF8(e.getXQueryFile()) << ":" << e.getXQueryLine () << ":" << e.getXQueryColumn() << "]" << std::endl \ << "xqilla:\t[" << e.getCppFile() << ":" << e.getCppLine() << "]" << std::endl; std::cout << serr.str() << std::endl; } } |