-1

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>();
}
DaBler
  • 2,695
  • 2
  • 26
  • 46
ndsfd ddsfd
  • 235
  • 1
  • 5
  • 13
  • Open all files in an XML editor and verify they're correct. Your xml seems to have spaces before the root tag, but I suppose that's just when you copied it into SO. – JP Moresmau May 22 '15 at 17:19
  • @JPMoresmau can you please advise the way by which i can remove the white spaces too that is the final xml should not contain any spaces at all – ndsfd ddsfd May 22 '15 at 17:22
  • No, the error would be different if the space was a problem. I think the two roots is the issue. – JP Moresmau May 22 '15 at 17:24

1 Answers1

0

Your XML has two roots! One XML file can only have one top level element, and you have two arokermail elements.

See http://en.wikipedia.org/wiki/Root_element:

Each XML document has exactly one single root element.

JP Moresmau
  • 7,388
  • 17
  • 31
  • can you please advise how can i remove arokermail elements so that it should not appear twice in the final xml message i need to remove them – ndsfd ddsfd May 22 '15 at 17:25
  • Create a top level object that contains your two mail objects and write that to XML. – JP Moresmau May 22 '15 at 17:26
  • Thanks a lot , request you to show please how to create the top level object which will contain both these objects invoiceReferenceNotificationMessage , invoiceReferenceNotificationMessage 1 – ndsfd ddsfd May 22 '15 at 17:28
  • 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; – ndsfd ddsfd May 22 '15 at 17:30
  • Well modify your Mail class to have a list of NotificationMessage instead of just one for example... – JP Moresmau May 22 '15 at 17:31
  • JPMoresmau I have make changes in my mail class , now request you to please advise and show how to make changes in object finally – ndsfd ddsfd May 22 '15 at 17:37