1

我正在尝试使用 Java / Xalan 以及来自https://sourceforge.net/projects/docbook/files/docbook-xsl/1.76.1/的官方 Docbook XSL 文件与一些本地 xsl的混合将一些 Docbook XSL 转换为 HTML提供一些自定义和覆盖的文件。

我想防止我的应用程序不得不下载外部资源或访问本地文件。所以我实现了一个扩展 URIResolver 接口的类。

问题是该resolve(final String href, final String base)函数没有提供足够的信息来识别正在请求的特定文件。

例如,本地覆盖文件之一是使用 .xsl 文件从 xsl 文件导入的<xsl:import href="../../../xsl/html.xsl"/>。在这种情况下,我的解析器类的 href 参数设置为 ../../../xsl/html.xsl,这很好。html.xsl 文件然后导入一个名为 defaults.xsl 的文件。href 参数设置为仅 defaults.xsl,base 参数设置为 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 参数不能唯一标识资源,而且您也无法通过查看先前 href 的顺序来猜测正在请求哪个文件。是否有一些技巧可以准确找出请求文件的上下文?

4

1 回答 1

2

您从中创建转换的源是否具有系统 ID?如果不是,这可能是您的基础在 URI 解析器中始终为空的原因。

如果您从输入流创建转换,您可以手动将系统 ID 分配给源。如有必要,您可以生成一个人工 URI,并在 URI 解析器中使用该人工 URI 映射回基本 URI。还要确保您在 URI 解析器中创建的源也具有系统 ID,否则从这些文件导入的资源也会出现同样的问题。

于 2011-10-17T23:48:26.433 回答