Monday, January 21, 2008

Create XML doc from database and transform the same to any given template in XSLT

//Use this piece of code to generate XML file which has HEADER and BODY parts.
//Body can have many rows identified by "TR" elements
//Each TR element can have many columns e.g. CL1, CL2, CL3

The code is written using JAXP and SAX. The following imports needs to be included

import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

----------------------------------------------------------------------------

File xmlFile = new File("temp.xml");
OutputStream inputXML = new FileOutputStream(xmlFile);
StreamResult streamResult = new StreamResult(inputXML);
SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory.newInstance();

// SAX2.0 ContentHandler.
TransformerHandler hd = tf.newTransformerHandler();
Transformer serializer = hd.getTransformer();
serializer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
serializer.setOutputProperty(OutputKeys.INDENT, "yes");
hd.setResult(streamResult);
hd.startDocument();
AttributesImpl atts = new AttributesImpl();

// DOCUMENT Element
hd.startElement("", "", DOCUMENT, atts);

// Generate Header Row Elements
hd.startElement("", "", HEADER, atts);
hd.startElement("", "", HCL1, atts);
hd.characters(header.toCharArray(), 0, header.length());
hd.endElement("", "", HCL1);

hd.startElement("", "", HCL2, atts);
hd.characters(todayStr.toCharArray(), 0, todayStr.length());
hd.endElement("", "", HCL2);

hd.startElement("", "", HCL3, atts);
hd.characters(lastHdr.toCharArray(), 0, lastHdr.length());
hd.endElement("", "", HCL3);
hd.endElement("", "", HEADER);

// Generate actual data Elements within Body Elements
hd.startElement("", "", BODY, atts);

//Put this code into a loop - for or while till u have row/tuples from DB
// Content Row Elements
hd.startElement("", "", TR, atts);

hd.startElement("", "", CL1, atts);
hd.characters("ABC".toCharArray(), 0, "ABC".length());
hd.endElement("", "", CL1);

hd.startElement("", "", CL2, atts);
hd.characters("XYZ".toCharArray(), 0,"XYZ".length());
hd.endElement("", "", CL2);

hd.startElement("", "", CL3, atts);
hd.characters("PQR".toCharArray(), 0,"PQR".length());
hd.endElement("", "", CL3);
hd.endElement("", "", TR);
//Loop ends here

hd.endElement("", "", BODY);

hd.endElement("", "", DOCUMENT);
hd.endDocument();

//Now the following piece of code transforms above generated XML file into Output file with given template file

Source xmlSource = new StreamSource(xmlFile);
File finalOutput = new File("Output.doc");
OutputStream out = new FileOutputStream(finalOutput);
Result result = new StreamResult(out);
TransformerFactory transFact = TransformerFactory.newInstance();
Transformer trans;
InputStream xsltFile = null;
xsltFile = getXSLTInput(); //Get your input template file
Source xsltSource = new StreamSource(xsltFile);
trans = transFact.newTransformer(xsltSource);
trans.transform(xmlSource, result);


Function to read input template file as class via classLoader

private InputStream getXSLTInput() {
InputStream xsltFile = null;
ClassLoader cl = CreateXMLDoc.class.getClassLoader();
if (cl != null) {
xsltFile = cl.getResourceAsStream(XSLTTemplateFile.xsl);
}
if (xsltFile == null) {
cl = Thread.currentThread().getContextClassLoader();
if (cl != null) {
xsltFile = cl.getResourceAsStream(XSLTTemplateFile.xsl);
}
}
if (xsltFile == null) {
cl = ClassLoader.getSystemClassLoader();
if (cl != null) {
xsltFile = cl.getResourceAsStream(XSLTTemplateFile.xsl);
}
}
return xsltFile;
}

2 comments:

Anonymous said...

Good words.

Anonymous said...

Amiable post and this enter helped me alot in my college assignement. Say thank you you on your information.