XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Topic Page 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
Charles TsangSubject: Saxon 8 with multiple xml input
Author: Charles Tsang
Date: 23 Jun 2007 11:11 AM
Hi, I have a java application that loads the xquery file
from the database (as byte[]), it also generates an xml file
(as String) as the input of xquery. I have the following
methods

BTW, I'm using Stylus Studio 2007 Release 2.


protected Properties getProperties() {
Properties props = new Properties();
props.setProperty(OutputKeys.METHOD, "xml");
props.setProperty(OutputKeys.INDENT, "yes");

return props;
}

protected void runXQuery(byte[] xquerySource, String xmlString) {

Configuration config = new Configuration();

StaticQueryContext sQueryContext = new StaticQueryContext(config);
DynamicQueryContext dQueryContext = new DynamicQueryContext(config);

ByteArrayInputStream bais = new ByteArrayInputStream(xquerySource);
InputStreamReader streamReader = new InputStreamReader(bais);

XQueryExpression queryExp = sQueryContext.compileQuery(streamReader);

ByteArrayInputStream bais = new ByteArrayInputStream(xmlString.getBytes());
StreamSource source = new StreamSource(bais);

dQueryContext.setContextItem(sQueryContext.buildDocument(source));

ByteArrayOutputStream baos = new ByteArrayOutputStream();

queryExp.run(dQueryContext, new StreamResult(baos), getProperties());
}

protected void runXQueryBind(byte[] xquerySource, String paramName, String xmlString) {

Configuration config = new Configuration();

StaticQueryContext sQueryContext = new StaticQueryContext(config);
DynamicQueryContext dQueryContext = new DynamicQueryContext(config);

ByteArrayInputStream bais = new ByteArrayInputStream(xquerySource);
InputStreamReader streamReader = new InputStreamReader(bais);

XQueryExpression queryExp = sQueryContext.compileQuery(streamReader);

try {
XQueryExpression xqe = sQueryContext.compileQuery(xmlString);

SequenceIterator si = xqe.iterator(dQueryContext).getAnother();
Item item = si.next();
if (item != null && si.next() == null && item instanceof AtomicValue) {
xvalue = (AtomicValue)item;
} else {
xvalue = new SequenceExtent(xqe.iterator(dQueryContext));
}
} catch(Exception ioe) {
ioe.printStackTrace();
//throw new JCException(ioe.getMessage());
xvalue = new UntypedAtomicValue(new String(data));
}
dQueryContext.setParameter(paramName, xvalue);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

queryExp.run(dQueryContext, new StreamResult(baos), getProperties());
}


Can someone help me with the following questions:

1) In method runXQueryBind, is that the right way to bind a paramName
and xmlString into XQuery? If not, can you show me a sample.

2) When I run my code using the 'runXQuery()' method, it took only 3
seconds. But when I run it with 'runXQueryBind()', it took 986
seconds!! Do you know why?

Your help is greatly appreciated


method

Postnext
Alberto MassariSubject: Saxon 8 with multiple xml input
Author: Alberto Massari
Date: 27 Jun 2007 11:48 AM
Hi Charles,
the bindParameter method generated by Stylus Studio has been designed to assign to a parameter the result of another XQuery (so that you can assign a specific type, xs:nonNegativeInt(9), or the result of an XPath navigation, or the result of a arithmetic computation).
In your case you are specifying an entire XML fragment; apart that parsing could fail (some XML nodes are not supported as literal values inside XQuery documents), you get bad performances as you are using the XQuery parser to build a query that in the end creates a DOM tree. You should directly parse the XML and assign it to the parameter, like in this code:

private static void bindXMLParameter(StaticQueryContext staticContext, DynamicQueryContext dynamicContext, String paramName, String paramValue)
{
try{
Value xvalue=new SingletonNode(staticContext.getConfiguration().buildDocument(new StreamSource(new StringReader(paramValue))));

dynamicContext.setParameter(paramName, xvalue);
}
catch(java.lang.Exception e)
{
System.err.print(e.getMessage());
}
}

Hope this helps,
Alberto

Posttop
Charles TsangSubject: Saxon 8 with multiple xml input
Author: Charles Tsang
Date: 27 Jun 2007 12:50 PM
Hi Alberto,

Your solution works!

Thanks,

Charles

 
Topic Page 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2016 All Rights Reserved.