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}indent-amount","2");
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à