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 导入语句的撒克逊错误的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中使用撒克逊语

撒克逊找不到函数:current-group

使用 XSLT 创建 PLSQL 语句以输出 XML

我们可以在 xslt 的 select 语句中使用动态变量名吗?

Sqoop 导入语句

PyCharm 中未使用的错误导入语句?