Java 将ArrayList呈现为XSLT
我有一个带有一些属性的对象Java 将ArrayList呈现为XSLT,java,xslt-1.0,apache-fop,Java,Xslt 1.0,Apache Fop,我有一个带有一些属性的对象PDFData。其中一个是Arraylist:一个带有String,另一个带有自定义对象(带有一些基本属性) 我需要使用XSLT呈现这两个列表,以便使用ApacheFop创建PDF文件。我在谷歌上搜索了多种方法来解决这个问题,但我什么也没找到 我的PDF渲染类是: public class PDFRender { public static final String SUMMARY_REPORT_XSL = "summary_report.xsl"; //privat
PDFData
。其中一个是Arraylist
:一个带有String
,另一个带有自定义对象(带有一些基本属性)
我需要使用XSLT呈现这两个列表,以便使用ApacheFop创建PDF文件。我在谷歌上搜索了多种方法来解决这个问题,但我什么也没找到
我的PDF渲染类是:
public class PDFRender {
public static final String SUMMARY_REPORT_XSL = "summary_report.xsl";
//private final Logger log = LoggerFactory.getLogger(getClass());
public ByteArrayInputStream createPDFFile(ByteArrayOutputStream xmlSource) throws IOException {
ByteArrayInputStream inputStream = null;
InputStream template = Thread.currentThread().getContextClassLoader().getResourceAsStream(SUMMARY_REPORT_XSL);
StreamSource transformSource = new StreamSource(template);
FopFactory fopFactory = FopFactory.newInstance();
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
ByteArrayOutputStream pdfOutStream = new ByteArrayOutputStream();
StreamSource source = new StreamSource(new ByteArrayInputStream(xmlSource.toByteArray()));
Transformer xslfoTransformer;
try {
TransformerFactory transfact = TransformerFactory.newInstance();
xslfoTransformer = transfact.newTransformer(transformSource);
Fop fop;
try {
fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, pdfOutStream);
// Resulting SAX events (the generated FO) must be piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
// Start XSLT transformation and FOP processing
try {
xslfoTransformer.transform(source, res);
inputStream = new ByteArrayInputStream(pdfOutStream.toByteArray());
} catch (TransformerException e) {
String msg = "Caught exception transforming source to generate PDF";
//log.error(msg, e);
throw new RuntimeException(msg, e);
}
} catch (FOPException e) {
String msg = "Caught FOP exception generating PDF";
//log.error(msg, e);
throw new RuntimeException(msg, e);
}
} catch (TransformerConfigurationException e) {
String msg = "Caught exception transforming source to generate PDF";
//log.error(msg, e);
throw new RuntimeException(msg, e);
}
return inputStream;
}
public ByteArrayOutputStream getXMLSource(PDFData data) throws Exception {
JAXBContext context;
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
try {
context = JAXBContext.newInstance(PDFData.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(data, outStream);
} catch (JAXBException e) {
String msg = "Caught exception marshalling application to generate PDF";
//log.error(msg, e);
throw new RuntimeException(msg, e);
}
return outStream;
}
}
PDFData
如下所示:
@XmlRootElement(name = "PDFData")
public class PDFData {
public String clientName;
public String clientProfile;
public String clientLang;
public URL clientLogo;
public ObjectId verificationId;
public String verificationCountry;
public String verificationDocumentType;
public List<Page> verificationPages = new ArrayList<>();
public String verificationTemplateName;
public Long verificationTime;
public List<ActionResult> verificationActions = new ArrayList<>();
public List<String> verificationMrz = new ArrayList<>();
/* ... */
}
更新3:woohoo!!本周末,我尝试了一些解决方案,并获得了一个循环:
<xsl:for-each select="verificationMrz">
<xsl:variable name="i" select="position()" />
<xsl:value-of select="$i" />
</xsl:for-each>
好的,酷!但是当我尝试使用索引(
)访问列表时,我没有得到任何值。我已经用
检查了列表是否为空,并且效果良好。所以我认为我的问题是变量I
,可能是数据类型?我不知道…解决了!这就是我一直在寻找的解决方案:
<xsl:for-each select="verificationMrz">
<xsl:value-of select="current()" />
</xsl:for-each>
这将打印我的字符串列表。对于“打印我的对象”,我还不确定如何检索它,但我会在解决它后尽快发布它。您可能会认为:“我的XSLT与此无关,因为我还没有任何相关信息。”。当您生成要由XSL FO引擎创建的XSL FO时,将数据转换为XSL FO的XSLT是100%相关的。@KevinBrown:我已经用XSLT更新了问题。谢谢您在XSLT的哪一部分传递任何信息。我哪儿也看不见。我看到的情况是这样的:没有任何地方会试图用内容来取代评论。@KevinBrown也许我说得不够清楚。我把我需要呈现列表的注释放在哪里。我没有任何代码,因为我不知道如何才能做到。。。谢谢
<xsl:for-each select="verificationMrz">
<xsl:value-of select="current()" />
</xsl:for-each>