const XMLXPath *XMLDocument::makeXPathQuery(const char *query, char **namespaces, int length, const XMLElement * e, std::string * error) { errorXPathBuffer.clear(); xmlXPathContext *ctxt = xmlXPathNewContext(document); if (!ctxt) { errorXPathBuffer.append(gettext("Cannot create a parser context")); *error = errorXPathBuffer; return 0; } if (e) { ctxt->node = (xmlNode *) e->getRealXMLPointer(); } if (namespaces) { for (int i = 0; i < length; i++) { xmlXPathRegisterNs(ctxt, (const xmlChar *)namespaces[i], (const xmlChar *)namespaces[i + length]); } } xmlSetStructuredErrorFunc(ctxt, XMLDocument::errorXPathFunction); xmlXPathCompExpr *expr = xmlXPathCtxtCompile(ctxt, (const xmlChar *)query); if (!expr) { xmlSetStructuredErrorFunc(ctxt, 0); xmlXPathFreeContext(ctxt); *error = errorXPathBuffer; return 0; } xmlXPathObject *xpath = xmlXPathCompiledEval(expr, ctxt); xmlSetStructuredErrorFunc(ctxt, 0); xmlXPathFreeContext(ctxt); xmlXPathFreeCompExpr(expr); if (!xpath) { *error = errorXPathBuffer; return 0; } return new XMLXPath(*this, xpath); }
/** * xmlSchematronAddTest: * @ctxt: the schema parsing context * @type: the type of test * @rule: the parent rule * @node: the node hosting the test * @test: the associated test * @report: the associated report string * * Add a test to a schematron * * Returns the new pointer or NULL in case of error */ static xmlSchematronTestPtr xmlSchematronAddTest(xmlSchematronParserCtxtPtr ctxt, xmlSchematronTestType type, xmlSchematronRulePtr rule, xmlNodePtr node, xmlChar *test, xmlChar *report) { xmlSchematronTestPtr ret; xmlXPathCompExprPtr comp; if ((ctxt == NULL) || (rule == NULL) || (node == NULL) || (test == NULL)) return(NULL); /* * try first to compile the test expression */ comp = xmlXPathCtxtCompile(ctxt->xctxt, test); if (comp == NULL) { xmlSchematronPErr(ctxt, node, XML_SCHEMAP_NOROOT, "Failed to compile test expression %s", test, NULL); return(NULL); } ret = (xmlSchematronTestPtr) xmlMalloc(sizeof(xmlSchematronTest)); if (ret == NULL) { xmlSchematronPErrMemory(ctxt, "allocating schema test", node); return (NULL); } memset(ret, 0, sizeof(xmlSchematronTest)); ret->type = type; ret->node = node; ret->test = test; ret->comp = comp; ret->report = report; ret->next = NULL; if (rule->tests == NULL) { rule->tests = ret; } else { xmlSchematronTestPtr prev = rule->tests; while (prev->next != NULL) prev = prev->next; prev->next = ret; } return (ret); }
static expression_type compile(evaluator_type const ctx, const CharT &str) { return xmlXPathCtxtCompile (ctx, reinterpret_cast<const wchar_type *>(str)); }