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>