Hi
I am experiencing the BaseX API XQJ and I compare to other XQJ NXD and I find the following problem.
Suppose we have the next XML file in database "test":
<?xml version="1.0" encoding="ISO-8859-1"?> <bookstore param="hao"> <book> <title>Book01</title> </book> <book> <title>Book02</title> </book> </bookstore>
If I execute:
XQDataSource xqs = ... XQConnection conn = xqs.getConnection(); XQExpression xqe = conn.createExpression(); String cad= "collection('test')//title";
XQResultSequence xqrs = xqe.executeQuery(cad); XMLStreamReader result = xqrs.getSequenceAsStream(); System.out.println("Iteration on XMLStreamReader..."); for(; result.hasNext(); result.next()) System.out.println(getEventString(result));
xqrs = xqe.executeQuery(cad); System.out.println("Using a Transformer..."); Source resultXML = new StAXSource(xqrs.getSequenceAsStream()); StreamResult resultSR = new StreamResult(System.out); TransformerFactory factory = TransformerFactory.newInstance(); Transformer tr = factory.newTransformer(); tr.setOutputProperty(OutputKeys.INDENT, "yes"); tr.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); tr.setOutputProperty("{http://xml.apache.org/xslt%7Dindent-amount%22,%222"); tr.transform(resultXML, resultSR);
where static String getEventString(final XMLStreamReader reader) { switch(reader.getEventType()) { case XMLStreamConstants.START_ELEMENT: return "START_ELEMENT:\t"" + reader.getLocalName() + """; case XMLStreamConstants.END_ELEMENT: return "END_ELEMENT:\t"" + reader.getLocalName() + """; case XMLStreamConstants.START_DOCUMENT: return "START_DOCUMENT"; case XMLStreamConstants.END_DOCUMENT: return "END_DOCUMENT"; case XMLStreamConstants.CHARACTERS: return "CHARACTERS:\t"" + reader.getText() + """; } return ""; }
I get:
Iteration on XMLStreamReader... START_ELEMENT: "title" CHARACTERS: "Book01" END_ELEMENT: "title" END_DOCUMENT START_ELEMENT: "title" CHARACTERS: "Book02" END_ELEMENT: "title" END_DOCUMENT Using a Transformer... <?xml version="1.0" encoding="UTF-8"?> <title>Book01</title>
It's not good!
When I use a Transformer I should get something similar to: <?xml version="1.0" encoding="UTF-8"?> <result> <title>Book01</title> <title>Book02</title> <result>
That is, if result sequence length is greater than 1, getSequenceAsStream should wrap the sequence in a containing result element, so to not break JAXP Transformers and XMLStreamReader events.
Is there any solution in BaseX ?
Thanks a lot!
Isidre Guixà