Java URIResolver、Docbook和XSL转换

Java URIResolver、Docbook和XSL转换,java,xslt,docbook,xalan,Java,Xslt,Docbook,Xalan,我试图使用Java/Xalan和来自的官方Docbook XSL文件与提供一些自定义和覆盖的本地XSL文件的混合,将一些Docbook XSL转换为HTML 我想防止我的应用程序不得不下载外部资源或访问本地文件。因此,我实现了一个扩展URIResolver接口的类 问题在于resolve(final String href,final String base)函数没有提供足够的信息来识别所请求的特定文件 例如,使用从xsl文件导入一个本地覆盖文件。在本例中,我的解析器类的href参数设置为../

我试图使用Java/Xalan和来自的官方Docbook XSL文件与提供一些自定义和覆盖的本地XSL文件的混合,将一些Docbook XSL转换为HTML

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

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

例如,使用
从xsl文件导入一个本地覆盖文件。在本例中,我的解析器类的href参数设置为../../../xsl/html.xsl,这很好。然后,html.xsl文件导入名为defaults.xsl的文件。href参数仅设置为defaults.xsl,而base参数设置为null

这之后可能会导入,在这种情况下,href参数设置为。但是,如果docbook.xsl导入名为defaults.xsl的文件,href参数也将设置为defaults.xsl,base设置为null


问题是href和base参数不能唯一地标识资源,而且您也无法通过观察以前的href的顺序猜出请求的文件。是否有一些技巧可以准确地找出请求文件的上下文?

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


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

这就是问题所在。我正在使用存储在数据库中的字符串在URIResolver中创建新的StreamSource对象,但我没有设置系统ID。一旦将StreamSource对象上的系统ID设置为我试图截取的URL或文件位置,则在resolve函数中设置了基参数,我可以识别正确的资源。谢谢普伦奇。什么是“系统ID”?@SansaKirov