【问题标题】:Saxon error with XSLT import statementXSLT 导入语句的撒克逊错误
【发布时间】: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 实现的代码。

标签: java xslt saxon


【解决方案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下怎么办?我没有让它正常运行......
猜你喜欢
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 2012-05-26
相关资源
最近更新 更多