2014-01-10 2 views
0

Когда я пытаюсь преобразовать xml с xslt в моем веб-приложении, исключение TransformerConfigurtionException выбрано на сервере weblogic 10.3. Тот же код веб-приложения отлично работает в Tomcat 7.0. Я не знаю, что может быть причиной этого исключения.TransformerConfigurationException: не удалось скомпилировать sytlesheet

Exception: 
javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet 
ERROR: 'Syntax error in 'format-date($date,'[MNn][D],[Y]','en',(),())'.' 
FATAL ERROR: 'Could not compile stylesheet' 

После удаления функции форматом даты в XSLT, я получил еще одно исключение (javax.xml.tranform.TransformerException: java.lang.ArrayIndexOutOfBoundsException

Код:

TransformerFactory factory = TransformerFactory.newInstance(); 

    try 
    { 
    factory.newTransformer().transform(new StreamSource(new StringReader(xml)), new StreamResult(transformResult)); 

    Source documentInfoSource = new StringSource(new String(transformResult.toByteArray())); 
    transformResult.reset(); 

    factory.setURIResolver(new URIResolver() 
    { 
    @Override 
    public Source resolve(String href, String base) throws TransformerException 
    { 
    try 
    { 
     return new StreamSource(EcrionDocumentRenderServiceImpl.class.getClassLoader().getResourceAsStream(href)); 
    } 

    catch(Exception e) 
    { 
     throw new TransformerException(e); 
    } 
    } 

    }); 
    factory.newTransformer(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream("template.xsl"))).transform(documentInfoSource, new StreamResult(transformResult));TransformerFactory factory = TransformerFactory.newInstance(); 

    try 
    { 
    factory.newTransformer().transform(new StreamSource(new StringReader(xml)), new StreamResult(transformResult)); 

    Source documentInfoSource = new StringSource(new String(transformResult.toByteArray())); 
    transformResult.reset(); 

    factory.setURIResolver(new URIResolver() 
    { 
    @Override 
    public Source resolve(String href, String base) throws TransformerException 
    { 
    try 
    { 
     return new StreamSource(EcrionDocumentRenderServiceImpl.class.getClassLoader().getResourceAsStream(href)); 
    } 

    catch(Exception e) 
    { 
     throw new TransformerException(e); 
    } 
    } 

    }); 
    factory.newTransformer(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream("template.xsl"))).transform(documentInfoSource, new StreamResult(transformResult)); 

ответ

1

format-date() является функция XSLT 2.0. Когда вы загружаете XSLT-трансформатор с помощью JAXP TransformerConfigurationFactory, у вас нет способа контролировать, является ли процессор, который возвращается, процессором XSLT 1.0 или 2.0 - это зависит от того, что будет найдено на cl asspath. Я предполагаю, что на пути к классам не было процессора XSLT 2.0, поэтому был загружен встроенный процессор Xalan по умолчанию, и это не поддерживает XSLT 2.0 (и, следовательно, format-date()).

Если ваш код зависит от XSLT 2.0, то

а) убедитесь, что Saxon находится на пути к классам

б) загрузите его в явном виде, заменив

TransformerFactory factory = TransformerFactory.newInstance(); 

с

TransformerFactory factory = new net.sf.saxon.TransformerFactoryImpl(); 
+0

Работает после перехода на саксонскую. Благодаря Kay – skumar

Смежные вопросы