How to enable XSLT 2.0 processor on JBoss eap 6.1 server to get rid of errors, for example, XSLT 2.0 functions are not available

I am trying to format a date in XSLT 2.0. When I try to run it in my workspace, it works fine, and I get the correct answer. But when I try to achieve the same after deploying my jar on JBoss eap 6.1, I get below error:

16: 35: 02,311 ERROR [XSLTUtil] (DefaultQuartzScheduler-camel-12_Worker-2) XSLTUtil | 0 | TransformerException: An error occurred while converting xml with the xslt file: javax.xml.transform.TransformerException: org.xml.sax.SAXException: Could not find function: format-dateTime javax.xml.transform.TransformerException: Could not find function: format- dateTime |

My Xsl file: here I am trying to format the current date in a different format using format-dateTime.

<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version='2.0'
    xmlns:xsl='http://www.w3.org/1999/XSL/Transform' 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:func="http://exslt.org/functions" 
    xmlns:date="http://exslt.org/dates-and-times" 
    date:doc="http://www.exslt.org/date" exclude-result-prefixes="date func">

    <xsl:import href="date.xsl"/>
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    <xsl:template match="/">
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:max="http://www.ibm.com/maximo">
            <soapenv:Header/>
            <soapenv:Body>
                <max:CreateMXINCIDENT_WSTB creationDateTime="" baseLanguage="" transLanguage="" messageID="" maximoVersion="">
                    <max:MXINCIDENT_WSTBSet>
                        <max:MXINCIDENT_WST action="" relationship="" deleteForInsert="" transLanguage="">
                            <max:MAXINTERRORMSG></max:MAXINTERRORMSG>
                            <max:ACTIVITY changed="true">
                                <xsl:value-of select='/tTroubleticket/activity' />
                            </max:ACTIVITY>
                            <max:BLOCK changed="">
                                <xsl:value-of select='/tTroubleticket/block' />
                            </max:BLOCK>
                            <max:CHANGEBY changed="true">AOS</max:CHANGEBY>
                            <max:CHANGEDATE changed="true">
                                <xsl:value-of select="format-dateTime(current-dateTime(), '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01].[f001][Z]')" />
                            </max:CHANGEDATE>
                            <max:CLASS changed="true">INCIDENT</max:CLASS>
                            <max:COMMERRORTYPE changed="true">
                                <xsl:value-of select='/tTroubleticket/commErrorType' />
                            </max:COMMERRORTYPE>
                            <max:COMPONENTLIST changed="true"></max:COMPONENTLIST>
                            <max:CREATEDBY changed=""></max:CREATEDBY>
                            <max:CREATIONDATE changed="true">
                                <xsl:value-of select="/tTroubleticket/interactiondate" />
                                <!-- <xsl:variable name="date" select="/tTroubleticket/interactiondate"></xsl:variable>
                                <xsl:variable name="intDt" select="xs:dateTime(concat(
                                    substring($date, 1, 4),'-',
                                    substring($date, 6, 2),'-',
                                    substring($date, 9, 2),'T',
                                    substring($date, 12, 2),':',
                                    substring($date, 15, 2),':',
                                    substring($date, 18, 2)))"></xsl:variable>
                                <xsl:value-of select="format-dateTime($intDt, '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01].[f001][Z]')" /> -->
                            </max:CREATIONDATE>
                            <max:DESCRIPTION changed="">
                                <xsl:variable name="objOwner" select="/tTroubleticket/mc_object_owner" />
                                <xsl:variable name="mcOwner" select="/tTroubleticket/mc_owner" />
                                <xsl:value-of select="concat($objOwner,'|',$mcOwner)" />
                            </max:DESCRIPTION>
                            </max:MXINCIDENT_WST>
                    </max:MXINCIDENT_WSTBSet>
                </max:CreateMXINCIDENT_WSTB>
            </soapenv:Body>
        </soapenv:Envelope>
    </xsl:template>
</xsl:stylesheet>

Here is the XSLT util class that I use to convert / display my XML and XSL files. In the bottom java file, I read the xsl file from my local directory. As soon as I distribute my jar to the JBoss server, I transfer the file location information and pass it to the XSLTFilename variable.

package com.al.ddr.fsw.tt.util.xml.transform;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
import com.al.ddr.common.logging.jb.Logger;    
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class XSLTUtil {

    Logger logger = Logger.getLogger(XSLTUtil.class);
    //Logger logger = Logger.getLogger("XSLTUtil");

    public String transformXML(String inXML, String XSLTFilename) throws TransformerFactoryConfigurationError, TransformerException {
        StringWriter xmlResultResource = new StringWriter();
        try {
            Source xslDoc = new StreamSource(XSLTFilename);
            Transformer transformer = TransformerFactory.newInstance().newTransformer(xslDoc);
            transformer.transform(new StreamSource(new StringReader(inXML)), new StreamResult(xmlResultResource));
            //logger.info("XSLTUtil",0,"XSLTUtil - transformXML() - Result : \n" + xmlResultResource.getBuffer().toString(),"");
        } catch (TransformerException e) {
            //logger.error("XSLTUtil",0,"TransformerException : Error occured while transforming xml with the xslt file : \n"+e.getMessage(),"");
        } catch (Exception e) {
            e.getMessage();
            //logger.error("XSLTUtil",0,"Error occured while transforming xml with the xslt file : \n"+e.getMessage(),"");
        }
        return xmlResultResource.getBuffer().toString();
    }

    public static void main(String[] args) throws TransformerFactoryConfigurationError, TransformerException {

        String xmlSourceResource = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + "<tTroubleticket>" + "<alarms>" + "<tTroubleTicketAlarm>" + "<alarmid>3117</alarmid>"
                + "<alarmName>OSS</alarmName>" + "</tTroubleTicketAlarm>" + "<tTroubleTicketAlarm>" + "<alarmid>3118</alarmid>" + "<alarmName>OS123</alarmName>" + "</tTroubleTicketAlarm>"
                + "</alarms>" + "<interactiondate>2014-11-21 11:22:34</interactiondate>" + "<troubleticketstate>QUEUED</troubleticketstate>"
                + "<mc_object_owner>amit</mc_object_owner>"+ "<mc_owner>kumar</mc_owner>"
                + "<troubledescription>Server down</troubledescription>" + "<system>IRU</system>" + "<subsystem>FJKH</subsystem>" + "<severity>1</severity>" + "<tecGroup>NSN</tecGroup>"
                + "<block>block</block>" + "<subBlock>sub_block</subBlock>" + "<history>new ticket created</history>" + "<Log>" + "<Logname>FJKH</Logname>" + "<LogSize>Nothing</LogSize>"
                + "<LogFile>" + "Hi" + "</LogFile>" + "</Log>" + "</tTroubleticket>";

        String xsltFilename = "C:/Users/akuma249/TTSimulator/aor-platform-tt/src/config/xslt_COLOMBIA/v11/CreateTicketRequest_WS_11.xsl";

        XSLTUtil util = new XSLTUtil();
        String transformedXML = util.transformXML(xmlSourceResource, xsltFilename);
        System.out.println(transformedXML);

    }

}

This piece of code works fine in my workspace. Do I need to configure something on my JBoss server to fix this problem? Please let me know exactly what I am missing.

+4
source share
3 answers

XALAN, JBoss EAP 6.1, JAVA_OPTS = "$ JAVA_OPTS -Djavax.xml.transform.TransformerFactory = net.sf.saxon.TransformerFactoryImpl" standalone.conf XALAN, XSLT 1.0 SAXON, XSLT 2.0. @ .

+4

Java Option

-Djavax.xml.transform.TransformerFactory = net.sf.saxon.TransformerFactoryImpl

script , JVM , . saxon-8.7.jar, saxon-dom-8.7.jar .

XSL- < xsl: stylesheet version = "2.0"... > ": XSLT 1.0 XSLT 2.0" , , .

, JVM , WildFly 10/JBoss EAP7, .

- JBoss EAP7 - XSLT 1.0 2.0 , module , EE, , EJB; , Maven. , WAR EAR ( Maven Scope) .

, XSLT2.0, :

javax.xml.transform.TransformerFactory tf = javax.xml.transform.TransformerFactory.newInstance();

javax.xml.transform.TransformerFactory tf = net.sf.saxon.TransformerFactoryImpl.newInstance();

.

XSLT 1.0, ( xalan factory Impl, factory)

javax.xml.transform.TransformerFactory tf = org.apache.xalan.processor.TransformerFactoryImpl.newInstance();

javax.xml.transform.TransformerFactory tf = javax.xml.transform.TransformerFactory.newInstance(
                    "org.apache.xalan.processor.TransformerFactoryImpl",
                    ClassLoader.getSystemClassLoader());
+1

A string <xsl:value-of select="format-dateTime(current-dateTime(), '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01].[f001][Z]')" />along with strings <xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs="http://www.w3.org/2001/XMLSchema"suggests that you are trying to use the XSLT 2.0 data type dateTimeand its functions. For this to work, you need to use an XSLT 2.0 processor such as Saxon 9. If you encounter an error that such functions are not defined, you are probably using code with an XSLT 1.0 processor, such as Xalan. I am not familiar with jboss, so I can’t say how to configure it to use the XSLT 2.0 processor instead of the XSLT 1.0 processor.

0
source

All Articles