/** * Run an XQuery statement against the input specified by pSourceDOM. Ouput is written to * pDestinationDOM. If pDestinationDOM has any existing children they are removed beforehand. * :{contexts} are supported in the XQuery String. * * @param pSourceDOM The Source data for the XQuery. * @param pAttachPoint The initial context node (".") of the XQuery expression. * @param pDestinationDOM The Destination for the output. * @param pXQuery The XQuery String. * @param pContextUElem Used for resolving any :{contexts} which appear in the XQuery. */ public static void runXQuery( DOM pSourceDOM, DOM pAttachPoint, DOM pDestinationDOM, String pXQuery, ContextUElem pContextUElem) { XQueryCompiler lCompiler = SaxonEnvironment.getXQueryCompiler(); // Rewrite :{context}s and the like pXQuery = SaxonEnvironment.replaceFoxMarkup(pXQuery, null); XQueryExecutable lExecutable; try { Track.pushDebug("XQueryCompile"); lExecutable = lCompiler.compile(pXQuery); } catch (SaxonApiException e) { throw new ExInternal("Error compiling XQuery", e); } finally { Track.pop("XQueryCompile"); } // TODO implement compiled XQuery cache XQueryEvaluator lEvaluator = lExecutable.load(); pDestinationDOM.removeAllChildren(); DOMContentHandler lContentHandler = new DOMContentHandler(pDestinationDOM); try { Track.pushDebug("XQueryPrepare"); lEvaluator.setSource(pSourceDOM.wrap()); lEvaluator.setContextItem(new XdmNode(pAttachPoint.wrap())); lEvaluator.setDestination(new SAXDestination(lContentHandler)); } catch (SaxonApiException e) { throw new ExInternal("Error preparing XQuery", e); } finally { Track.pop("XQueryPrepare"); } try { Track.pushDebug("XQueryExecute"); SaxonEnvironment.setThreadLocalContextUElem(pContextUElem); lEvaluator.run(); } catch (SaxonApiException e) { throw new ExInternal("Error running XQuery", e); } finally { Track.pop("XQueryExecute"); SaxonEnvironment.clearThreadLocalContextUElem(); } }
@BeforeMethod public void setUp() throws SaxonApiException { MockitoAnnotations.initMocks(this); given(processorFactory.createProcessor()).willReturn(processor); given(processor.newXQueryCompiler()).willReturn(xQueryCompiler); given(xQueryCompiler.compile(QUERY)).willReturn(xQueryExecutable); given(xQueryExecutable.load()).willReturn(xQueryEvaluator); given(inputSourceFactory.createInputSource(INPUT)).willReturn(inputSource); given(saxSourceFactory.createSAXSource(inputSource)).willReturn(saxSource); given(byteArrayOutputStreamFactory.createByteArrayOutputStream()).willReturn(outputStream); }
private <T> T execute(XQueryExecutable executable, ExecutionContext context) { try { XQueryEvaluator evaluator = executable.load(); for (ExternalVariable externalVariable : context.getExternalVariables()) { evaluator.setExternalVariable( externalVariable.getName(), new XdmAtomicValue(externalVariable.getValue())); } evaluator.setTraceListener(traceExtension.getTraceListener()); XdmValue result = evaluator.evaluate(); return xdmValueConverter.convert(result); } catch (SaxonApiException e) { throw new RuntimeException(e); } }