2011-01-14 84 views
8

我想在調用我的變換時捕獲java中的xsl:message。以下是我的代碼片段。在java中捕獲xsl:消息輸出

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

不幸的是,這是行不通的。

有沒有更好的方法?

在此先感謝!

+0

您正在使用哪種xslt處理器? – 2011-01-14 20:32:42

+0

相信我在javax.xml.transform。*中使用Xalan。我的樣式表是版本2. – 2011-01-14 20:59:36

回答

11

如果您使用的是撒克遜,那麼您可能需要set the message emitter using setMessageEmitter()

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

public void setMessageEmitter(Receiver receiver)

設置接收器將被用於的xsl:消息輸出。

JAXP接口的最新版本指定默認輸出xsl:message發送到 註冊的ErrorListener。 撒克遜不做 不執行這個約定。 取而代之的是,輸出發送到 默認消息發射器,這是 標準薩克森發射器接口的微小定製實現 。

此接口可用於更改撒克遜輸出 xsl:message輸出的方式。

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是東西,是 在較晚的 階段(許多遺憾 場合之一,該規範被改變 單方面匹配的Xalan 實現)介紹JAXP ,並且我決定不將 實現爲默認的 行爲,因爲它本來會是 擾亂了exis應用

在薩克森,xsl:message輸出 定向到一個接收器,您可以 提名的變壓器:

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

如果你想跟着輸出發送到 的JAXP模型 ErrorListener,你可以提名一個 收件人這樣做:

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