2011-01-14 16 views
8

Dönüşümü çağırırken java'da xsl: mesajını yakalamaya çalışıyorum. Aşağıda kodumun bir pasajı var.Yakalama xsl: java'da ileti çıktısı

 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; 
     } 

Ne yazık ki bu çalışmıyor.

Daha iyi bir yolu var mı?

Şimdiden teşekkürler!

+0

Hangi xslt işlemcisini kullanıyorsunuz? –

+0

jaalanx.xml.transform ile Xalan kullanıyorum *. Stil sayfam sürüm 2'dir. –

+0

Düzeltme. işlemci Saxon. Aşağıdaki cevap xsl: mesaj çıktısını almak için bir çözümdür. –

cevap

11

Eğer Sakson kullanıyorsanız, o zaman set the message emitter using setMessageEmitter() gerekebilir. mesajı çıktı: Alıcı Set

public void setMessageEmitter(Receiver receiver)

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

xsl için kullanılacak. JAXP arayüzünün

Son sürümler varsayılan olarak xsl:message ait çıkış kayıtlı ErrorListener gönderilir belirtin. Saxon bu sözleşmeyi uygulamıyor . Bunun yerine, çıktı, standart Saxon Verici arabiriminin biraz özelleştirilmiş uygulaması olan bir varsayılan ileti göndericisine gönderilir.

Bu arabirim, Sakson çıkışlarının xsl:message çıktısının çıkış şeklini değiştirmek için kullanılabilir.

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 (Spec tek taraflı Xalan uygulanmasını maç için değiştirildi birçok üzücü kez birinde) oldukça geç aşamada JAXP tanıtıldı şeydi ve bu değişikliği varsayılan olarak davranışı olarak uygulamamaya karar verdim, çünkü exis için yıkıcı olurdu ting uygulamaları.

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

Eğer çıktı gönderme JAXP modelini takip etmek istiyorsanız: Saxon yılında

, xsl:message çıkış Eğer Trafo için aday bir Alıcı, yönlendirilmiş olduğu

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

: ErrorListener, bu yapan bir Alıcı aday gösterebilirsiniz
+1

net.sf.saxon.event.MessageWarner eski sürümler için doğru sınıftır (9.3 ve daha önceki?) Sakson ve Sakson-CE (9.3 kod tabanına dayanır). Saxon'un daha yeni sürümlerinde net.sf.saxon.serialize.MessageWarner. Bu durumun, errorListener uyarı() yöntemine iletildiğini, = "evet" ifadesinin sonlandırılmadıkça, bunları error() yöntemine gönderdiğine dikkat edin. – EricS

+1

Birinin ilgilenmesi durumunda: Saxon'un TransformerFactory için bir ambalaj hazırladım: https://github.com/nverwer/cocooncomponents/blob/master/src/org/apache/cocoon/components/xslt/SaxonTransformerFactoryImpl.java – rakensi