getting exception while doing xslt transformation through java [duplicate]

旧时模样 提交于 2019-12-20 07:42:40

问题


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

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 partof 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 t =abc+def; //generated xml
    String xslFilePath1 = "C:\\xsl\\rok.xsl";";
    String outputhtml =null;

    try
        {
            st.transform(t, xslFilePath1, outputhtml);
            }
    catch (TransformerConfigurationException e)
                {
                    System.err.println("TransformerConfigurationException");
                    System.err.println(e);
                }
                catch (TransformerException e)
                {
                    System.err.println("TransformerException");
                    System.err.println(e);
                }

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);

        }






the error that i am getting is ..




    TransformerException
    javax.xml.transform.TransformerException: Result object passed to ''{0}'' is invalid.

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>

回答1:


That XML formed by

String t =abc+def; //generated xml

isn't well-formed. In particular you've created a document from concatenating two existing XML documents, and consequently it doesn't have a single root node. I don't quite know what you want to achieve (perhaps transform each XML document and then concatenate), but your concatenation of the two docs is certainly not valid.




回答2:


The problem is in the constructor of StreamResult, you are passing null there. And this is what it expects

public StreamResult(String systemId) 
Construct a StreamResult from a URL.
Parameters:
    systemId - Must be a String that conforms to the URI syntax.

You should use another constructor. This should work, if your xml and xsl is correct (and t contains your xml). Note that StringBufferInputStream is deprecated but works as a quick-and-dirty solution):

TransformerFactory factory = TransformerFactory.newInstance();
     //File object with path to your xsl file
StreamSource xslStream = new StreamSource(new File("C:\\xsl\\rok.xsl"));
Transformer transformer = factory.newTransformer(xslStream);
    //Read xml from string
StreamSource in = new StreamSource(new StringBufferInputStream(t));
    //Prints to stdout
StreamResult out = new StreamResult(System.out);


来源:https://stackoverflow.com/questions/30400903/getting-exception-while-doing-xslt-transformation-through-java

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!