URIResolver, Docbook и XSL Transform - PullRequest
       1

URIResolver, Docbook и XSL Transform

1 голос
/ 18 октября 2011

Я пытаюсь преобразовать некоторые Docbook XSL в HTML с использованием Java / Xalan и смеси официальных файлов Docbook XSL из https://sourceforge.net/projects/docbook/files/docbook-xsl/1.76.1/ с некоторыми локальными xsl-файлами, которые предоставляют некоторые настройки и переопределения.

Я хочу запретить моему приложению загружать внешние ресурсы или получать доступ к локальным файлам.Поэтому я реализовал класс, который расширяет интерфейс URIResolver.

Проблема в том, что функция resolve(final String href, final String base) не предоставляет достаточно информации для идентификации конкретного запрашиваемого файла.

Например, один из локальных файлов переопределения импортируется из файла xsl с помощью <xsl:import href="../../../xsl/html.xsl"/>.В этом случае параметр href для моего класса резолвера имеет значение ../../../xsl/html.xsl, что нормально.Затем файл html.xsl импортирует файл с именем defaults.xsl.Параметр href имеет значение только defaults.xsl, а базовый параметр имеет значение null.

За этим может последовать импорт http://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xsl,, в этом случае для параметра href установлено значение http://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xsl. Однако, если docbook.xsl импортирует файл с именем defaults.xsl,для параметра href также установлено значение defaults.xsl, а для base задано значение null.

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

1 Ответ

2 голосов
/ 18 октября 2011

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

Если вы создаете преобразования из входных потоков, вы можете вручную назначить системный идентификатор источника.При необходимости вы можете сгенерировать искусственный и использовать этот искусственный URI в вашем преобразователе URI для сопоставления с базовым URI.Также убедитесь, что источники, которые вы создаете в своем преобразователе URI, также имеют системные идентификаторы, или такая же проблема возникнет с ресурсами, импортированными из этих файлов.

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