aslcore/src/org/gcube/application/framework/core/util/TransformXSLT.java

121 lines
4.1 KiB
Java

package org.gcube.application.framework.core.util;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
/**
* @author Valia Tsagkalidou (KNUA)
*
*/
public class TransformXSLT {
/**
* Transforms an xml document based on the given xslt
* @param xslt the xslt for transforming the xml
* @param xml the xml to be transformed
* @return a string containing the transformed xml (output of the transformation)
*/
public static String transform(String xslt, String xml)
{
Transformer transformer;
try
{//Retrieve the XSLT from the DIS (generic resource), and create the transformer
ByteArrayInputStream xsltStream = new ByteArrayInputStream(xslt.getBytes());
TransformerFactory tFactory = TransformerFactory.newInstance();
transformer = tFactory.newTransformer(new StreamSource(xsltStream));
DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
Document doc = null;
doc = dfactory.newDocumentBuilder().parse(xml);
// Apply the transformation
ByteArrayOutputStream ba_stream = new ByteArrayOutputStream();
OutputFormat format = new OutputFormat(doc);
format.setIndenting(false);
format.setOmitDocumentType(true);
format.setOmitXMLDeclaration(true);
StringWriter writer = new StringWriter();
XMLSerializer serial = new XMLSerializer(writer,format);
serial.serialize(doc);
transformer.transform(new StreamSource(new ByteArrayInputStream(writer.toString().getBytes())), new StreamResult(ba_stream));
//Prepares the object to be returned
StringBuffer buffer = new StringBuffer();
try {
InputStreamReader isr = new InputStreamReader( new ByteArrayInputStream(ba_stream.toByteArray()),
"UTF8");
Reader in2 = new BufferedReader(isr);
int ch;
while ((ch = in2.read()) > -1) {
buffer.append((char)ch);
}
in2.close();
return buffer.toString();
} catch (Exception e) {
e.printStackTrace();
}
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* Transforms an xml document based on the given transformer
* @param transformer the transformer based on which the transformation will be applied
* @param xml the xml document to be transformed
* @return a string containing the transformed xml (output of the transformation)
*/
public static String transform(Transformer transformer, String xml)
{
DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
Document doc = null;
try
{
doc = dfactory.newDocumentBuilder().parse(xml);
ByteArrayOutputStream ba_stream = new ByteArrayOutputStream();
OutputFormat format = new OutputFormat(doc);
format.setIndenting(false);
format.setOmitDocumentType(true);
format.setOmitXMLDeclaration(true);
StringWriter writer = new StringWriter();
XMLSerializer serial = new XMLSerializer(writer,format);
serial.serialize(doc);
transformer.transform(new StreamSource(new ByteArrayInputStream(writer.toString().getBytes())), new StreamResult(ba_stream));
//Prepares the object to be returned
StringBuffer buffer = new StringBuffer();
try {
InputStreamReader isr = new InputStreamReader( new ByteArrayInputStream(ba_stream.toByteArray()),
"UTF8");
Reader in2 = new BufferedReader(isr);
int ch;
while ((ch = in2.read()) > -1) {
buffer.append((char)ch);
}
in2.close();
return buffer.toString();
} catch (Exception e) {
e.printStackTrace();
}
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
}