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

最佳答案

您要从其创建转换的Source是否具有系统ID?如果不是,这可能是您的URI解析器中基数始终为null的原因。

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

关于java - URIResolver,Docbook和XSL转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7800514/

10-13 04:09