2011-08-29 44 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