gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:11:51 24 4
gpt4 key购买 nike

我需要将 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 到 HTML 解析的 Java 代码。请在下面找到我的代码。

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

最佳答案

尝试更改 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,但至少根据您到目前为止所展示的方法,我的建议可能会解决您收到的错误。

关于java - 在java中使用XSL将XML解析为HTML抛出解析问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49827811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com