URIResolver,Docbook和XSL Transform

时间:2011-10-17 22:48:00

标签: java xslt docbook xalan

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

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

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

例如,使用<xsl:import href="../../../xsl/html.xsl"/>从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的顺序来猜测正在请求哪个文件。是否有一些技巧可以确切地找出请求文件的上下文?

1 个答案:

答案 0 :(得分:2)

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

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