2011-01-14 14 views
8

में संदेश आउटपुट मैं 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 प्रोसेसर का उपयोग कर रहे हैं? –

+0

का मानना ​​है कि मैं jalax.xml.transform के साथ Xalan का उपयोग कर रहा हूं। *। मेरी स्टाइलशीट संस्करण 2 है। –

+0

सुधार। प्रोसेसर सैक्सन है। नीचे जवाब उत्तर xsl: संदेश आउटपुट कैप्चर करने का समाधान है। –

उत्तर

11

यदि आप सैक्सन का उपयोग कर रहे हैं, तो आपको set the message emitter using setMessageEmitter() की आवश्यकता हो सकती है। संदेश उत्पादन:

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

public void setMessageEmitter(Receiver receiver)

सेट रिसीवर XSL के लिए प्रयोग की जाने वाली।

जेएक्सपी इंटरफ़ेस के हाल के संस्करण निर्दिष्ट करते हैं कि xsl:message का आउटपुट पंजीकृत त्रुटिसूची में भेजा गया है। सैक्सन इस सम्मेलन को लागू नहीं करता है। इसके बजाय, आउटपुट डिफ़ॉल्ट संदेश एमिटर को भेजा जाता है, जो मानक सक्सन एमिटर इंटरफ़ेस के थोड़ा अनुकूलित कार्यान्वयन है।

इस इंटरफ़ेस का उपयोग उस तरीके को बदलने के लिए किया जा सकता है जिसमें सैक्सन 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 के लिए विघटनकारी होता टिंग अनुप्रयोग

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

आप के उत्पादन भेजने का JAXP मॉडल का पालन करना चाहते हैं:

सेक्सन में, xsl:message उत्पादन एक रिसीवर है, जो आप ट्रांसफार्मर के लिए नामांकित कर सकते हैं करने के लिए निर्देशित है

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

: ErrorListener, आप एक रिसीवर है कि इस करता नामांकित कर सकते हैं
+1

net.sf.saxon.event.MessageWarner पुराने संस्करणों के लिए सही वर्ग है (9।3 और पहले?) सैक्सन, और सैक्सन-सीई (जो 9.3 कोडबेस पर आधारित है)। यह सैक्सन के नए संस्करणों में net.sf.saxon.serialize.MessageWarner है। ध्यान दें कि यह त्रुटि लिस्टनर की चेतावनी() विधि को संदेश भेजता है, जब तक कि "हां" समाप्त न हो, जिस स्थिति में यह उन्हें त्रुटि() विधि में भेजता है। – EricS

+1

यदि कोई दिलचस्पी लेता है: मैंने सैक्सन ट्रांसफॉर्मर फैक्ट्री के लिए यहां एक रैपर बनाया है: https://github.com/nverwer/cocooncomponents/blob/master/src/org/apache/cocoon/components/xslt/SaxonTransformerFactoryImpl.java – rakensi

संबंधित मुद्दे