XSLT 导入语句的撒克逊错误
Posted
技术标签:
【中文标题】XSLT 导入语句的撒克逊错误【英文标题】:Saxon error with XSLT import statement 【发布时间】:2011-11-06 08:51:32 【问题描述】:每当我有 XSLT 导入语句时,Saxon 处理器都会给我一个错误。这是错误:
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 等和同样的东西......如果我删除导入语句,一切正常!它找不到要导入的文件,这很好,但这就是为什么我有解析器类来帮助它找到文件,但它永远不会触发解析器并且无法找到要导入的文件!
我该如何解决这个问题?
【问题讨论】:
你怎么知道你的 URIResolver 没有被调用?显示 URIResolver 实现的代码。 【参考方案1】:您可能需要 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);
【讨论】:
正确答案。 xsl:import 可能在没有基本 URI 的情况下工作,前提是有一个 URIResolver,但只是很困难,因为规则说如果你有两个相同绝对 URI 的导入,你会得到相同的模块。 @Mads Hansen,谢谢。那行得通。然而,URIResolver 甚至没有被触发仍然很奇怪。 但是如果xslt文件在jar文件的resources下怎么办?我没有让它正常运行......以上是关于XSLT 导入语句的撒克逊错误的主要内容,如果未能解决你的问题,请参考以下文章