package org.basex.examples.xqj.tutorial; import java.io.*; import javax.xml.namespace.*; import javax.xml.transform.*; import javax.xml.transform.sax.*; import javax.xml.transform.stream.*; import javax.xml.xquery.*; import org.xml.sax.*; import org.xml.sax.helpers.*; /** * XQJ Examples, derived from an * <a href="https://www.progress.com/products/data-integration-suite/data-integration-suite-developer-center/data-integration-suite-tutorials/learning-xquery/introduction-to-the-xquery-api-for-java-xqj-"> * XQJ online tutorial</a>. * * Part 10: XML Pipelines. * * @author BaseX Team 2005-17, BSD License */ public final class Part10 extends Main { /** * Main method of the example class. * @param args (ignored) command-line arguments * @throws Exception exception */ public static void main(final String... args) throws Exception { init("10: XML Pipelines"); // Create a connection XQConnection xqc = connect(); // Pipeline XQuery expressions String path = new File("src/main/resources/xml").getAbsolutePath(); XQExpression xqe = xqc.createExpression(); XQSequence xqs = xqe.executeQuery("doc('" + path + "/orders.xml')//order"); XQExpression xqe2 = xqc.createExpression(); xqe2.bindSequence(new QName("orders"), xqs); XQSequence xqs2 = xqe2.executeQuery( "declare variable $orders as element() external; " + "for $order in $orders where $order/@status = 'closed' " + "return <closed_order id = '{$order/@id}'>{ " + " $order/* }</closed_order>"); print("Pipeline XQuery expressions", xqs2); xqe2.close(); xqe.close(); // Passing XSLT results to XQuery info("Passing XSLT results to XQuery"); // Build an XMLFilter for the XSLT transformation SAXTransformerFactory stf = (SAXTransformerFactory) TransformerFactory.newInstance(); XMLFilter xmlf = stf.newXMLFilter(new StreamSource(path + "/orders.xsl")); // Create a SAX source, the input for the XSLT transformation SAXSource saxSource = new SAXSource(xmlf, new InputSource(path + "/orders.xml")); // Create an XQuery expression XQPreparedExpression xqp = xqc.prepareExpression( "declare variable $var external; <result>{ $var }</result>"); // Bind the input document to prepared expression xqp.bindDocument(new QName("var"), saxSource, null); // Execute the query and print results xqs = xqp.executeQuery(); xqs.writeSequenceToResult(new StreamResult(System.out)); System.out.println(); // Passing XQuery results to XSLT info("Passing XQuery results to XSLT"); // Create an XQuery expression xqp = xqc.prepareExpression("doc('" + path + "/orders.xml')"); // Create an XQJFilter XQJFilter xqjf = new XQJFilter(xqp); // Create an XMLFilter for the XSLT transformation, the 2nd stage stf = (SAXTransformerFactory) TransformerFactory.newInstance(); xmlf = stf.newXMLFilter( new StreamSource(path + "/orders.xsl")); xmlf.setParent(xqjf); // Make sure to capture the SAX events as result of the pipeline xmlf.setContentHandler(new DefaultHandler()); // Activate the pipeline xmlf.parse(new InputSource()); // Close the connection close(xqc); } /** * XQuery for Java filter. */ private static class XQJFilter extends XMLFilterImpl { /** Prepared expression. */ final XQPreparedExpression expression; /** * Constructor. * @param xqp prepared expression */ XQJFilter(final XQPreparedExpression xqp) { expression = xqp; } @Override public void parse(final InputSource source) throws SAXException { try { XQSequence xqs = expression.executeQuery(); SAXResult result = new SAXResult(getContentHandler()); xqs.writeSequenceToResult(result); xqs.close(); } catch(XQException ex) { throw new SAXException(ex); } } } }