Создание Saxon для создания нового результирующего документа при запуске с Java

#java #xslt-2.0 #saxon

#java #xslt-2.0 #saxon

Вопрос:

Я пытаюсь запустить Saxon HE с Java, используя код, который можно найти в ресурсах Saxon. Я попытался изменить его так, чтобы он не создавал дополнительный файл из кода Java, но вместо этого использовал файл xslt, выполняющий это с помощью «result-document».

Мой xslt действительно работал, как задумано в Altova XMLSpy, но я хотел посмотреть, смогу ли я заставить Saxon делать то же самое — не повезло, за исключением сильной головной боли и множества разочарований и множества пожеланий, чтобы Python получил поддержку для этого когда-нибудь в ближайшее время…

Я получаю следующее сообщение об ошибке: системный идентификатор основного выходного файла неизвестен.

Когда я гуглю, я нахожу ответ, что базовый uri не может быть найден, но нигде не видно, как установить базовый uri…

Итак, мой первый вопрос: где установлен базовый uri? Это в классе Java или в файле xslt? Я не вижу, где я мог бы установить это в файле xslt, поэтому я предполагаю, что мне пришлось бы установить это как свойство компилятора / трансформатора?

Другой вопрос касается фактического атрибута href результирующего документа. Если я хочу указать относительный путь, каков синтаксис и, возможно, как будет выглядеть пример? А как насчет абсолютных путей?

В моем файле, который работает в Altova, я каким-то образом получаю базовый uri для исходного xml-файла, который должен быть преобразован, а затем направляю выходные данные в относительный каталог. В Saxon базовый uri вместо этого, похоже, получает местоположение файла xslt… Понятия не имею, почему это так. При установке абсолютного пути я получаю сообщение об ошибке, в котором указано, что я использую неизвестный протокол. Итак, я ввел «file:///» перед путем. Теперь я получаю предупреждение с жалобой на то, что документ недоступен по пути, который объединен из пути к файлу xslt и пути поиска, который я использую во время преобразования.

Как вы можете видеть, я здесь повсюду, поэтому я был бы очень признателен за некоторые руководства и помощь.

Комментарии:

1. Не могли бы вы, пожалуйста, показать свой код?

Ответ №1:

Существует два API для запуска преобразования Saxon, и вы не сказали, какой из них вы используете.

В любом случае, относительный URI, используемый в атрибуте href xsl:result-document, разрешается относительно «базового выходного URI» преобразования.

Если вы используете API преобразования JAXP, это было разработано для XSLT 1.0, который не распознает концепцию URI базового вывода. Поэтому Saxon использует SystemID объекта результата JAXP, предоставленного в качестве назначения преобразования. Если у объекта результата JAXP нет системного идентификатора, например, если вы предоставляете DOMResult или StreamResult без указанного системного идентификатора, вы, скорее всего, получите сообщение об ошибке.

В отличие от этого, API s9api был разработан для XSLT 2.0 (с расширениями для 3.0), и поэтому его объект XsltTransformer имеет явный setBaseOutputURI() метод.

Если вы что-то сделали, и это не сработало, то, пожалуйста, расскажите нам, что именно вы сделали и как именно произошел сбой, и тогда мы сможем помочь вам сделать это правильно в следующий раз. Сложно отлаживать код, который мы не видим.

Комментарии:

1. Спасибо за ваш вклад в это. Я использую s9api API, и большая часть кода, который я использую, взята из одного из примеров, которые я нашел в ресурсах Saxon. Без этого я бы еще больше заблудился, так что спасибо вам и за эти примеры. Я переписал свой Java-код так, что записал свои преобразования в строку, а оттуда в документ. Причина этого в том, что я обнаружил, что проще извлечь сложный DOCTYPE, который должен входить в результат без изменений, проще сделать с помощью регулярного выражения, а затем объединить мои результаты. Я попробовал setOutputURI, и это решило некоторые проблемы.

2. Чтобы это сработало, я установил для вывода абсолютный путь.