I generate a .pdf from java object and I'd like to pass values from java object to my header/footer in .xsl. Here's a part of my .xsl:
<fo:page-sequence master-reference="content">
<fo:static-content flow-name="Header">
<fo:table border-collapse="collapse" font-size="8pt">
<fo:table-body>
<fo:table-row>
<fo:table-cell border="0.5pt solid black" overflow="hidden" > Œ
<fo:block vertical-align="middle" margin-left="0.2cm" text-align="left">
Supplier’s name: <xsl:value-of select="@name" />
</fo:block>
<fo:block vertical-align="middle" margin-left="0.2cm" text-align="left">
Supplier’s code: <xsl:param name="supplierCodeLol" />
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:static-content>
<fo:static-content flow-name="Footer">
<fo:table border-collapse="collapse" font-size="8pt">
<fo:table-body>
<fo:table-row>
<fo:table-cell border="0.5pt solid black" overflow="hidden" >
<fo:block vertical-align="middle" margin-left="0.2cm" text-align="left">
Export requestor: <xsl:param name="exportRequestor" />
</fo:block>
</fo:table-cell>
<fo:table-cell border="0.5pt solid black" overflow="hidden">
<fo:block></fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="10pt">
<xsl:for-each select="block">
<xsl:call-template name="block-template" select="."></xsl:call-template>
</xsl:for-each>
</fo:block>
<fo:block id="theEnd" />
</fo:flow>
</fo:page-sequence>
Where I create the .pdf:
public void convertToPDF(String xml, String fileName) throws IOException, FOPException, TransformerException {
ClassLoader classLoader = getClass().getClassLoader();
File xsltFile = new File(classLoader.getResource("template/xml/xsl_test.xsl").getFile());
StreamSource xmlSource;
if (xml == null) {
xmlSource = new StreamSource(new File(classLoader.getResource("template/xml/xml_test.xml").getFile()));
} else {
xmlSource = new StreamSource(new ByteArrayInputStream(xml.getBytes()));
}
FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
OutputStream out;
out = new java.io.FileOutputStream(fileName);
try {
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(xsltFile));
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(xmlSource, res);
} finally {
out.close();
}
}
This is where I create and fill .pdf with java object (header part):
public String exportPlaneToPdfa(PLANE plane, UserBean user, String fileName) {
PdfHelper pdfHelper = new PdfHelper();
Document doc = new Document(toXmlElement(plane, userName));
XMLOutputter outter = new XMLOutputter(Format.getPrettyFormat());
String xml = outter.outputString(doc);
pdfHelper.convertToPDF(xml, "/" + fileName);
return fileName;
}
private Element toXmlElement(PlaneBean plane, String userName) {
Element planeRoot = new Element(XmlHelper.PLANE);
XmlHelper.addAllContents(planeRoot, toHeaderXmlElement(plane));
return planeRoot;
}
private Element toHeaderXmlElement(PlaneBean plane) {
Element header = new Element(XmlHelper.BLOCK);
header.setAttribute(XmlHelper.NAME, "Equipment");
Element row = new Element(XmlHelper.ROW);
XmlHelper.addAllContents(row,
XmlHelper.newFieldElement("Supplier's name", plane.name),
XmlHelper.newFieldElement("Supplier's code", plane.code)));
XmlHelper.addAllContents(header, row);
return header;
}
Create a block and display it works but I don't know how to pass block's values to header. I searched for xsl:value-of/param but I do not know if that's the way to do it. Thanks a lot for your help !
EDIT: I've found the answer here

To get you started. You can declare a
xsl:param name="someName"as child of thexsl:stylesheet. And then use it as a global variablexsl:value-of select="$someName"i.e. like this: