I have the below java class in which i am using xstream rite now as you can see that in the below java class i am generating xml from the object later on i am doing xsl transformation by applying xslt on the generated xml in which i am getting error the steps i have done is shown below
InvoiceReferenceNotificationMessage invoiceReferenceNotificationMessage = new InvoiceReferenceNotificationMessage();
invoiceReferenceNotificationMessage.setInvoiceReference("SM/829709/0315");
invoiceReferenceNotificationMessage.setABSReference("IRMAR157311");
invoiceReferenceNotificationMessage.setCurrency("GBP");
invoiceReferenceNotificationMessage.setInvoiceAmount(2546);
invoiceReferenceNotificationMessage.setPaidAmount(1245);
invoiceReferenceNotificationMessage.setBalanceAmount(0);
invoiceReferenceNotificationMessage.setValueDate(new Date());
invoiceReferenceNotificationMessage.setRemarks("abc");
InvoiceReferenceNotificationMessage invoiceReferenceNotificationMessage1 = new InvoiceReferenceNotificationMessage();
invoiceReferenceNotificationMessage1.setInvoiceReference("SM/15");
invoiceReferenceNotificationMessage1.setABSReference("I157311");
invoiceReferenceNotificationMessage1.setCurrency("EUR");
invoiceReferenceNotificationMessage1.setInvoiceAmount(255546);
invoiceReferenceNotificationMessage1.setPaidAmount(125545);
invoiceReferenceNotificationMessage1.setBalanceAmount(0);
invoiceReferenceNotificationMessage1.setValueDate(new Date());
invoiceReferenceNotificationMessage1.setRemarks("abERRc");
Mail m = new Mail();
String xslFilePath1 = "C:\\xsl\\rok.xsl";
m.setInvoiceReferenceNotificationMessage(invoiceReferenceNotificationMessage);
XStream xstream = new XStream();
xstream.alias("arokermail",Mail.class);
String abc = xstream.toXML(m);
m.setInvoiceReferenceNotificationMessage(invoiceReferenceNotificationMessage1);
xstream.alias("arokermail",Mail.class);
String def = xstream.toXML(m);
String t =abc+def;
so the above code generates the following xml
<arokermail>
<invoiceReferenceNotificationMessage>
<InvoiceReference>SM/829709/0315</InvoiceReference>
<ABSReference>IRMAR157311</ABSReference>
<Currency>GBP</Currency>
<InvoiceAmount>2546.0</InvoiceAmount>
<PaidAmount>1245.0</PaidAmount>
<BalanceAmount>0.0</BalanceAmount>
<ValueDate>2015-05-22 15:44:14.741 IST</ValueDate>
<Remarks>abc</Remarks>
</invoiceReferenceNotificationMessage>
</arokermail>
<arokermail>
<invoiceReferenceNotificationMessage>
<InvoiceReference>SM/15</InvoiceReference>
<ABSReference>I157311</ABSReference>
<Currency>EUR</Currency>
<InvoiceAmount>255546.0</InvoiceAmount>
<PaidAmount>125545.0</PaidAmount>
<BalanceAmount>0.0</BalanceAmount>
<ValueDate>2015-05-22 15:44:14.741 IST</ValueDate>
<Remarks>abERRc</Remarks>
</invoiceReferenceNotificationMessage>
</arokermail>
now i have also created an xsl which i have stored in my computer named rok.xsl which i want to apply on generated xml as a part of xsl transformation so the below xsl i have stored in a variable as shown below..
String xslFilePath1 = "C:\\xsl\\rok.xsl";
now please advise how to apply this xsl on generated xml the generated xml is stored in a string variable named t ;
String t =abc+def;
below is what i have tried by calling a function and passing parameters
String t1 = transformXmlMessageUsingXslFile(xslFilePath1,t);
and the function being called is shown below
public void transform(String dataXML, String inputXSL, String outputHTML)
throws TransformerConfigurationException, TransformerException
{
TransformerFactory factory = TransformerFactory.newInstance();
StreamSource xslStream = new StreamSource(inputXSL);
Transformer transformer = factory.newTransformer(xslStream);
StreamSource in = new StreamSource(dataXML);
StreamResult out = new StreamResult(outputHTML);
transformer.transform(in, out);
System.out.println("The generated HTML file is:" + outputHTML);
}
String t1 = transformXmlMessageUsingXslFile(xslFilePath1,t);
and the methods that are being called for xsl transformation is shown below
public static String transformXmlMessageUsingXslFile(String xslFilePath,
String messageToTransform) {
ByteArrayInputStream byteStream = new ByteArrayInputStream(
messageToTransform.getBytes());
BufferedInputStream buffMsg = new BufferedInputStream(byteStream);
Source msgStreamSource = new StreamSource(buffMsg);
String transformedXML = null;
try {
Transformer xsltTransformer = buildTransformer(xslFilePath);
transformedXML = transformMessageUsingXslt(msgStreamSource,
xsltTransformer);
} catch (Exception e) {
e.printStackTrace();
}
return transformedXML;
}
private static String transformMessageUsingXslt(Source msgStreamSource,
Transformer xsltTransformer) throws Exception {
// StringWriter to hold output
StringWriter strWriter = new StringWriter();
// Result stream
Result xmlOutput = new StreamResult(strWriter);
// String to hold transformed xml
String transformedXML = null;
try {
// perform XSL transformation
xsltTransformer.transform(msgStreamSource, xmlOutput);
// get the transformed xml
transformedXML = strWriter.toString();
System.out.println("*######********#####***");
System.out.println(transformedXML);
} finally {
strWriter.close();
}
System.out.println("************");
return transformedXML;
}
public static Transformer buildTransformer(String xslFilePath) {
Source xsltSource = new StreamSource(xslFilePath);
TransformerFactory transFact = TransformerFactory.newInstance();
Transformer xslTransformer = null;
try {
xslTransformer = transFact.newTransformer(xsltSource);
System.out.println("##########");
System.out.println(xslTransformer.toString());
} catch (TransformerConfigurationException e) {
e.printStackTrace();
}
return xslTransformer;
}
the error that i am getting upon execution specially for the line is ..
// perform XSL transformation
xsltTransformer.transform(msgStreamSource, xmlOutput);
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl@161dfb5
ERROR: 'The markup in the document following the root element must be well-formed.'
ERROR: 'com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: The markup in the document following the root element must be well-formed.'
javax.xml.transform.TransformerException: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: The markup in the document following the root element must be well-formed.
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source)
i have updated the xsl so my rok.xsl is like shown below..
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
Hello,
<br>
</br>
<br>
</br>
Please be advised of the following payment details
<font color="black" face="Arial" size="2" >
<br>
<br>
<table border="1" cellpadding="3" cellspacing="0">
<tr bgcolor="lightblue">
<td nowrap="nowrap">Invoice Reference</td>
<td nowrap="nowrap">ABSReference</td>
<td nowrap="nowrap">Currency</td>
<td nowrap="nowrap">Invoice Amount</td>
<td nowrap="nowrap">Paid Amount</td>
<td nowrap="nowrap">Balance Amount</td>
<td nowrap="nowrap">Value Date</td>
<td nowrap="nowrap">Remarks</td>
</tr>
<xsl:for-each select="arokermail/invoiceReferenceNotificationMessage">
<tr>
<td nowrap="nowrap"><xsl:value-of select="InvoiceReference" /></td>
<td nowrap="nowrap"><xsl:value-of select="ABSReference" /></td>
<td nowrap="nowrap"><xsl:value-of select="Currency" /></td>
<td nowrap="nowrap"><xsl:value-of select="InvoiceAmount" /></td>
<td nowrap="nowrap"><xsl:value-of select="PaidAmount" /></td>
<td nowrap="nowrap"><xsl:value-of select="BalanceAmount" /></td>
<td nowrap="nowrap"><xsl:value-of select="ValueDate" /></td>
<td nowrap="nowrap"><xsl:value-of select="Remarks" /></td>
</tr>
</xsl:for-each>
<TR>
</TR>
</table>
</br>
</br>
<p>
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
</br>
</br>
</p>
</font>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
update Mail class is shown below..
public class Mail {
private List<InvoiceReferenceNotificationMessage> invoiceReferenceNotificationMessage = new ArrayList<InvoiceReferenceNotificationMessage>();
public List<InvoiceReferenceNotificationMessage> getInvoiceReferenceNotificationMessages() {
return invoiceReferenceNotificationMessage;
}
public void addInvoiceReferenceNotificationMessage(InvoiceReferenceNotificationMessage invoiceReferenceNotificationMessage) {
this.invoiceReferenceNotificationMessage.add(invoiceReferenceNotificationMessage);
}
private List<InvoiceReferenceNotificationMessage> InvoiceReferenceNotificationMessage =
new ArrayList<InvoiceReferenceNotificationMessage>();
}