How to pass error message generated by xslt application for java application

I am using a java application to invoke xslt to convert xml. The xslt file generates a message and terminates the process if some condition occurs. However, my java application was not able to catch the error message generated by xslt, it only catches an exception with general information - "Removal oriented".

Here is my Java code:

SAXTransformerFactory saxTFactory = ((SAXTransformerFactory) tFactory);
    // Create a TransformerHandler for  stylesheet.
    File f2 = new File(styleSheetPath);

TransformerHandler tHandler2 = saxTFactory.newTransformerHandler (new StreamSource (f2));

XMLReader reader = XMLReaderFactory.createXMLReader ();

reader.setContentHandler(tHandler2);
reader.setProperty("http://xml.org/sax/properties/lexical-handler", tHandler2);

    CharArrayWriter outputWriter  = new CharArrayWriter();
    Result result = new StreamResult(outputWriter);
    tHandler2.setResult(result);

    try
    {
      reader.parse(new InputSource(new StringReader(XMLinput)));
    }
    catch(Exception ee)
    {
        dsiplay(ee.getMessage())
        throw ee;
    }

How can I catch an error message from xslt?

I tried to write a class:

private class MyErrorHandler extends DefaultHandler {

  public void error(SAXParseException e)
  {
      System.out.println("error method "+e.getMessage());
  }

  public void fatalError(SAXParseException e)
  {
      System.out.println("fatal error method "+e.getMessage());
  }

  public void warning(SAXParseException e)
  {
      System.out.println("warning method "+e.getMessage());
  }

and

MyErrorHandler myHandler = new MyErrorHandler();

reader.setErrorHandler(myHandler);

This did not work.

Do you have any suggestions?

+3
3

, XML- , . Transformer, XMLReader

tHandler2.getTransformer().setErrorListener(myHandler);

IIRC, Transformer , ContentHandler/TranformerHandler.

, , URI (, XSLT , , URI, ).

+5

XSLT ? ,  < XSL: > , . .

+1

Thank you so much for your reply. Here is my xslt code:

<xsl:template match="*[not(*) and ((text() and not(normalize-space(text()) != '')) or .='') 
       and name(.) != 'para' and name(.) != 'recordDelimiter' and name(.) != 'physicalLineDelimiter' and name(.) != 'fieldDelimiter' ]">
      <xsl:message terminate="yes">
        <xsl:call-template name="output_message3_fail">
          <xsl:with-param name="current_node" select="name(.)"/>
        </xsl:call-template>
      </xsl:message>
 </xsl:template>

 <xsl:template name="output_message3_fail">
    <xsl:param name="current_node"/>
    <xsl:text>
      Conversion to EML2.1 failed:
      The EML 2.0.1 document has empty string value in some elements which shouldn't be empty string in EML 2.1.0 sepcification - </xsl:text>
    <xsl:value-of select="$current_node"/>
</xsl:template>    

I use <xsl:message>to generate an error message.

+1
source

Source: https://habr.com/ru/post/1703448/


All Articles