Jboss AS 7 / Xalan unable to call user-defined functions ?
ndubien Aug 6, 2013 6:06 AMHi,
I am wondering how I can use extensions written in Java with JBoss AS 7 and Xalan. It worked perfectely on my local JVM but failed as I used JBoss. The idea is to process a XSL+XML file with Xalan Transformer and user-defined functions written in Java.
I know that the same question has been asked one year ago on this forum but nobody answered:
https://community.jboss.org/message/763695#763695
These are the tracebacks I got when I launched the transformation:
2013/08/06 11:24:36.957 ncegcolnx JFS_REG APP XslfoErrorListener | ERROR [PFX: --XSL004.web-- - 0001] Trace details for com.tdm.service.jfs.app.engine.xslfo.XslfoEngine: TransformerFactory: |
#Exception: javax.xml.transform.TransformerException
#Message: Cannot find class 'com.tdm.service.jfs.app.engine.xslfo.functions.XalanAddOns'.
#Stack: javax.xml.transform.TransformerException: Cannot find class 'com.tdm.service.jfs.app.engine.xslfo.functions.XalanAddOns'.
at org.apache.xalan.xsltc.trax.TransformerFactoryImpl.passErrorsToListener(TransformerFactoryImpl.java:661) | |
at org.apache.xalan.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:836) | |
at org.apache.xalan.xsltc.trax.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:618) | |
at __redirected.__TransformerFactory.newTransformer(__TransformerFactory.java:129) | |
at com.tdm.service.jfs.app.engine.xslfo.XslfoEngine.format(XslfoEngine.java:271) | |
... |
2013/08/06 11:24:36.959 ncegcolnx JFS_REG APP XslfoErrorListener | ERROR [PFX: --XSL004.web-- - 0001] Trace details for com.tdm.service.jfs.app.engine.xslfo.XslfoEngine: TransformerFactory: |
#Exception: javax.xml.transform.TransformerException
#Message: Cannot find external method 'com.tdm.service.jfs.app.engine.xslfo.functions.XalanAddOns.doSmth' (must be public).
#Stack: javax.xml.transform.TransformerException: Cannot find external method 'com.tdm.service.jfs.app.engine.xslfo.functions.XalanAddOns.doSmth' (must be public).
at org.apache.xalan.xsltc.trax.TransformerFactoryImpl.passErrorsToListener(TransformerFactoryImpl.java:661) | |
at org.apache.xalan.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:836) | |
at org.apache.xalan.xsltc.trax.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:618) | |
at __redirected.__TransformerFactory.newTransformer(__TransformerFactory.java:129) | |
at com.tdm.service.jfs.app.engine.xslfo.XslfoEngine.format(XslfoEngine.java:271) | |
... |
My XSL file is quite simple and had been tested on a local JVM:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:addons="xalan://com.tdm.service.jfs.app.engine.xslfo.functions.XalanAddOns"
extension-element-prefixes="addons" >
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="A4-portrait" page-height="29.7cm" page-width="21.0cm" margin="5mm">
<fo:region-body region-name="xsl-region-body" />
</fo:simple-page-master>
<fo:page-sequence-master master-name="default-sequence">
<fo:repeatable-page-master-reference master-reference="A4-portrait"/>
</fo:page-sequence-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="default-sequence">
<fo:flow flow-name="xsl-region-body">
<fo:block color="#770199" font-size="9px" text-align="right" border-bottom="1px solid #A5A5A5" margin-bottom="5mm">
<xsl:value-of select="addons:doSmth()" />
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
And my Java code is the following:
267 | TransformerFactory tFactory = TransformerFactory.newInstance(); |
268 | Transformer transformer = null; |
269 | tFactory.setErrorListener(xslfoErrorListenerFactory); |
270 | tFactory.setAttribute("debug", true); |
271 | transformer = tFactory.newTransformer(new StreamSource(_layoutPath + _layoutFileName)); |
272 | transformer.setErrorListener(xslfoErrorListenerTransformer); |
273 | transformer.transform(new StreamSource(xmlInput), new StreamResult(xalanOutput)); |
Thank you in advance for your answer.
Best regards,
Nicolas DUBIEN