Заставить Saxon создать новый документ результатов при запуске из Java - PullRequest
0 голосов
/ 17 марта 2019

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

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

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

Когда я в Google, я нахожу ответ, что базовый URI не может быть найден, нонигде не видно, как установить базовый URI ...

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

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

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

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

1 Ответ

0 голосов
/ 17 марта 2019

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

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

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

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

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

...