Захват xsl: вывод сообщений в Java - PullRequest
8 голосов
/ 14 января 2011

Я пытаюсь перехватить сообщение xsl: 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;
      }

К сожалению, это не работает.

Есть ли лучший способ?

Заранее спасибо!

1 Ответ

12 голосов
/ 15 января 2011

Если вы используете Saxon, то вам может потребоваться установить отправитель сообщения с помощью setMessageEmitter () .

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

public void setMessageEmitter(Receiver receiver)

Установите приемник, который будет использоваться для вывода сообщения xsl:.

В последних версиях интерфейса JAXP указано, что по умолчанию вывод xsl:message отправляется зарегистрированному ErrorListener. Saxon не реализует это соглашение. Вместо этого выходные данные отправляются отправителю сообщений по умолчанию, который является слегка настраиваемой реализацией стандартного интерфейса Saxon Emitter.

Этот интерфейс может использоваться дляизменить способ вывода Saxon xsl:message output.

Майкл Кей объяснил, почему Saxon не выводит xsl:message в соответствии с интерфейсом JAXP, и предложил два варианта получениявывод :

ErrorListener был представлен JAXP на довольно позднем этапе (один из многих прискорбных случаев, когда спецификация изменялась в одностороннем порядке в соответствии с реализацией Xalan), и Я решил не применять это изменение как поведение по умолчанию, поскольку оно могло бы нарушить работу существующих приложений .

В Saxon выход xsl:message направляется на приемник, который вы можете назначить на трансформатор:

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

Если вы хотите следовать модели JAXPотправив вывод в ErrorListener, вы можете назначить получателя, который делает это:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...