2011-08-29 31 views
7

每当我有一个XSLT导入语句时,撒克逊处理器给我一个错误。以下是错误:撒克逊错误与XSLT导入语句

XTSE0165: I/O error reported by XML parser processing file: shared/test.xslt (The system cannot find the path specified): 

这里是我的XSLT文件看起来像:

<?xml version='1.0' encoding='UTF-8'?> 

<xsl:stylesheet version='2.0' 
    xmlns:xsl='http://www.w3.org/1999/XSL/Transform' 
    xmlns:fn='http://www.w3.org/2005/02/xpath-functions' 
    xmlns:xs='http://www.w3.org/2001/XMLSchema' 
    > 

    <xsl:import href="shared/test.xslt"/> 

... 

我的Java代码

TransformerFactory transformerFactory = TransformerFactoryImpl.newInstance(); 

transformerFactory.setURIResolver(uriResolver); //my own custom URI resolver 

Transformer transformer = transformerFactory.newTransformer(new StreamSource(xsltInputStream)); //this is where the error occurs when I debug! 

的URI解析器类永远不会触发!它阻塞了上面的newTransformer()方法....我试着XsltCompiler等等和相同的东西...如果我删除导入语句,一切正常!它无法找到要导入的文件,这很好,但这就是为什么我有解析器类来帮助它定位文件,但它永远不会触发解析器,并且无法定位要导入的文件!

我该如何解决这个问题?

+0

你怎么知道你的URIResolver没有被调用?显示您的URIResolver实现的代码。 –

回答

7

您可能需要set the System ID为您加载的XSLT的StreamSource

StreamSource加载时,它不知道XSLT“存在”的位置,并且难以确定如何解析相对路径。

StreamSource source = new StreamSource(xsltInputStream); 
source.setSystemId(PATH_TO_THE_XSLT_FILE_ON_THE_FILESYSTEM_OR_URL); 
Transformer transformer = transformerFactory.newTransformer(source); 
+0

正确答案。当没有提供基础URI时,xsl:import可能会工作,但有一个URIResolver,但由于规则说如果对同一绝对URI有两个导入,则会返回相同的模块。 –

+0

@Mads Hansen,谢谢。这工作。然而,仍然奇怪URIResolver甚至没有被触发。 – Ayyoudy

+0

但如果xslt文件在资源下的jar文件中该怎么办?我没有得到它正常运行... – YaP