Я пытаюсь преобразовать некоторые 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 не уникально идентифицируют ресурс, и вы не можете угадать, какой файл используется.просили, наблюдая за порядком предыдущих ссылок.Есть ли какая-то хитрость, чтобы выяснить, в каком именно контексте запрашивается файл?