我有下面的java类,我现在正在使用xstream rite,因为你可以看到在下面的java类中我将从后面的对象生成xml我正在通过在生成的xml上应用xslt进行xsl转换我收到错误我已经完成的步骤如下所示
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;
所以上面的代码生成以下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>
现在我还创建了一个xsl,我已经存储在我的计算机中,名为rok.xsl,我希望将其应用于生成的xml作为xsl转换的一部分,因此下面的xsl我已经存储在一个变量中,如下所示。
String xslFilePath1 = "C:\\xsl\\rok.xsl";
现在请告知如何在生成的xml上应用此xsl生成的xml存储在名为t的字符串变量中;
String t =abc+def;
下面是我通过调用函数和传递参数
尝试的String t1 = transformXmlMessageUsingXslFile(xslFilePath1,t);
,被调用的函数如下所示
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;
}
我专门针对该行执行的错误是..
// 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)
我更新了xsl所以我的rok.xsl如下所示..
<?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>
更新邮件类如下所示..
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>();
}
答案 0 :(得分:0)
你的XML有两个根源!一个XML文件只能有一个顶级元素,并且您有两个arokermail元素。
请参阅http://en.wikipedia.org/wiki/Root_element:
每个XML文档只有一个根元素。