在java抛出解析问题中使用XSL将XML解析为HTML

时间:2018-04-14 04:07:42

标签: java xml xslt

我需要将XML转换为HTML文档。我试图在XSLT的帮助下将XML转换为HTML。 在我的XSLT中,我有很少的字符,如é& 在解析为HTML文档时,会给出以下错误。

The entity "eacute" was referenced, but not declareded é

The entity "euro" was referenced, but not declareded.

请找到我的XSLT文件

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/receipt">
    <html>
        <head>
        </head>
        <body>
            <table style="width: 100%;">
                <tr>
                    <td style="text-align: center; width: 25%;">
                    </td>
                    <td style="font-size: 12px; vertical-align: top; width: 25%;">

                        46-68 Kléber<br/>
                        Tél: +1 <br/>
                        Fax: +1
                    </td>
                    <td style="font-size: 12px; vertical-align: top; width: 25%;">
                        725 € <br />

                    </td>
                    <td style="text-align: center; width: 25%;">Date <xsl:value-of select="date" /></td>
                </tr>
            </table>
        </body>
    </html>
</xsl:template>
</xsl:stylesheet>

正在编写用于XML的Java代码到HTML解析。请在下面找到我的代码。

public static StringWriter getOrderAcknowledgementPDF(JSONObject obj) throws IOException, DocumentException
{

     StringBuilder xml = new StringBuilder();
     String header="<?xml version=\"1.0\" encoding=\"UTF-8\"?>";

            StringBuilder sb = new StringBuilder();
            sb.append(header);
            JSONObject json = new JSONObject(obj.toString());
            xml.append(header);
            xml.append("\n");
            xml.append("<delivery_receipt>");
            xml.append(XML.toString(json));
            xml.append("</delivery_receipt>");


        System.out.println("XML--->"+xml);

        Transformer transformer;
        try {
            transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(new File("D:/Phase2/UAT_Phase/Order_Acknowledgement/template.xsl")));
        } catch (TransformerConfigurationException | TransformerFactoryConfigurationError e1) {
            throw ExceptionUtils.handle((Exception) e1);
        }
        StringWriter sw = new StringWriter();
        try {
            transformer.transform(new StreamSource(new ByteArrayInputStream(xml.toString().getBytes("UTF-8"))), new StreamResult(sw));
        } catch (TransformerException e) {
            throw ExceptionUtils.handle(e);
        }
        return sw;
}


protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

try {
        String orderid=req.getParameter("item");    
        String reportname = "OrderAcknowledgement"; 
        resp.setHeader("Content-Disposition", "attachment; filename=" + reportname + ".pdf");

        StringWriter result = service.getOrderAcknowledgementPDF(orderid);
        File file = File.createTempFile("Order_Acknowledgement-", ".pdf");
        ITextRenderer renderer = new ITextRenderer();
        try {
            renderer.getFontResolver().addFont("C:/WINDOWS/FONTS/ARIAL.TTF", true);
        } catch (DocumentException e) {
            throw ExceptionUtils.handle(e);
        }
        String fileNameWithPath = "D:/" + "PDF-FromHtmlString.pdf";
        String str=result.toString().replace("<META http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">", "<META http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />");
         str=str.replace("<br>", "<br />");
        System.out.println("after replacing....-->"+str);
        XMLResource res = XMLResource.load(new StringReader("<html><head><style>@page { size : 45cm 30cm; }</style></head><body>"+str + "</body></html>"));
        resp.setContentType("application/pdf");
        org.w3c.dom.Document doc2 = res.getDocument();
        renderer.setDocument(doc2, "file:/C:/");
        renderer.layout();
        if(fileNameWithPath != null)
        {
              resp.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", fileNameWithPath));
        }

        OutputStream browserStream = resp.getOutputStream();
        renderer.createPDF(browserStream);
    }
}

在以下行中收到错误:

 XMLResource res = XMLResource.load(new StringReader("<html><head><style>@page { size : 45cm 30cm; }</style></head><body>"+str + "</body></html>"));

1 个答案:

答案 0 :(得分:2)

尝试更改XSLT以创建XHTML,例如

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="/receipt">
    <html>
        <head>
        </head>
        <body>
            <table style="width: 100%;">
                <tr>
                    <td style="text-align: center; width: 25%;">
                    </td>
                    <td style="font-size: 12px; vertical-align: top; width: 25%;">

                        46-68 Kléber<br/>
                        Tél: +1 <br/>
                        Fax: +1
                    </td>
                    <td style="font-size: 12px; vertical-align: top; width: 25%;">
                        725 € <br />

                    </td>
                    <td style="text-align: center; width: 25%;">Date <xsl:value-of select="date" /></td>
                </tr>
            </table>
        </body>
    </html>
</xsl:template>
</xsl:stylesheet>

然后使用

而不是使用StringWriter和StreamResult
DOMResult result = new DOMResult();

将其用作转换结果,例如

transformer.transform(new StreamSource(new ByteArrayInputStream(xml.toString().getBytes("UTF-8"))), result);

然后您可以将Document resultDoc = result.getNode()提供给您的

renderer.setDocument(resultDoc, ...); 

这应该避免实体引用的问题,我不知道你使用的渲染器如何与XHTML一起工作,所以可能有更好的方法来使用该API,但是根据你到目前为止我已经显示的方法我的建议至少可能会解决你得到的错误。

相关问题