2011-01-14 10 views
8

Estoy tratando de capturar xsl: message en java al llamar a mi transformación. A continuación hay un fragmento de mi código.Capture xsl: mensaje de salida en java

 final ArrayList<TransformerException> errorList = new ArrayList<TransformerException>(); 
     ErrorListener errorListener = new ErrorListener() { 
      @Override 
      public void warning(TransformerException e) throws TransformerException { 
      //To change body of implemented methods use File | Settings | File Templates. 
      log.error(e.getMessage()); 
      errorList.add(e); 
      } 

      @Override 
      public void error(TransformerException e) throws TransformerException { 
      //To change body of implemented methods use File | Settings | File Templates. 
      log.error(e.getMessage()); 
      errorList.add(e); 
      } 

      @Override 
      public void fatalError(TransformerException e) throws TransformerException { 
      //To change body of implemented methods use File | Settings | File Templates. 
      errorList.add(e); 
      throw e; 
      } 
     }; 
     ... 
     try 
     { 
     transformer.setErrorListener(errorListener); 
     newDoc = transform(transformer, oldDoc); 
     } 
     catch (TransformerException e) { 
     log.error("Problem transforming normalized document into PUBS-XML", e); 
     throw e; 
     } 

Desafortunadamente esto no está funcionando.

¿Hay una manera mejor?

¡Gracias de antemano!

+0

¿Qué procesador xslt estás usando? –

+0

creo que estoy usando Xalan con javax.xml.transform. *. Mi hoja de estilo es la versión 2. –

+0

Corrección. el procesador es sajón. La siguiente respuesta es la solución para capturar xsl: mensaje de salida. –

Respuesta

11

Si está utilizando Saxon, entonces puede necesitar set the message emitter using setMessageEmitter().

http://www.saxonica.com/documentation/javadoc/net/sf/saxon/Controller.html

public void setMessageEmitter(Receiver receiver)

programar el receptor para ser utilizado para XSL: salida de mensajes.

Las versiones recientes de la interfaz JAXP especifican que, de forma predeterminada, la salida de xsl:message se envía al ErrorListener registrado. Saxon does no implementa esta convención. En cambio, la salida se envía a un emisor de mensaje predeterminado , que es una implementación ligeramente personalizada de la interfaz estándar de Emisor de Saxon.

Esta interfaz se puede utilizar para cambiar la forma en que las salidas de Saxon xsl:message salen.

Michael Kay has explained why Saxon doesn't output xsl:message according to the JAXP interface, and has suggested two options for obtaining the output:

ErrorListener era algo que se presentación a JAXP a un poco tarde etapa (uno de los muchos lamentables ocasiones en las que la especificación se cambió unilateralmente para que coincida con la implementación Xalan ) , y Decidí no implementar este cambio como un comportamiento predeterminado , porque habría sido perjudicial para exis ting aplicaciones.

En Saxon, xsl:message de salida es dirigida a un receptor, que puede nominar al transformador:

((net.sf.saxon.Controller)transformer).setMessageEmitter(....)

Si usted quiere seguir el modelo JAXP de enviar la salida a la ErrorListener, puede designar a un receptor que hace esto:

((net.sf.saxon.Controller)transformer).setMessageEmitter(new net.sf.saxon.event.MessageWarner())

+1

net.sf.saxon.event.MessageWarner es la clase correcta para versiones anteriores (9.3 y anteriores?) De Saxon, y Saxon-CE (que se basa en la base de código 9.3). Es net.sf.saxon.serialize.MessageWarner en las versiones más nuevas de Saxon. Tenga en cuenta que esto envía mensajes al método warning() de ErrorListener, a menos que termine = "sí", en cuyo caso los envía al método error(). – EricS

+1

En caso de que alguien esté interesado: hice un contenedor para TransformerFactory de Saxon aquí: https://github.com/nverwer/cocooncomponents/blob/master/src/org/apache/cocoon/components/xslt/SaxonTransformerFactoryImpl.java – rakensi

Cuestiones relacionadas