我的程序从不是项目根目录的位置读取文档。该文档包含一个相对路径。当程序应用该路径时,它确实从项目的根目录开始。如何使其应用文档原始位置的路径?
这是详细信息。有点长,但很简单。
我在 Eclipse 中有一个 Java 项目,位于
C:\one\two\three\four\five
该程序运行一个 XSL 转换,它将 Schematron 模式作为输入,并生成一个新的 XSLT 样式表作为输出。架构位于
C:\one\two\three\four\five\six\S\P\schema.sch
它包含这一行,还有几个类似的:
<sch:let name="foo" select="document('../../C/P/bar.xml')"/>
如果您从架构的位置开始并应用该相对路径,您最终会得到
C:\one\two\three\four\five\six\C\P\bar.xml
这是 的正确位置bar.xml
。然而,当我运行我的程序时,我得到了一些错误,这些错误似乎都与这个相似或相关:
Recoverable error on line 1262
FODC0002: I/O error reported by XML parser processing
file:/C:/one/two/three/C/P/bar.xml:
C:\one\two\three\C\P\bar.xml (The system cannot find the path specified)
FODC0002
是“检索资源时出错”的错误代码。这是有道理的,因为这不是bar.xml
. 似乎相对路径正在应用于项目的根目录。这是相关代码:
void compileToXslt(byte[] schema) throws Exception {
XsltCompiler comp = Runtime.getSaxonProcessor().newXsltCompiler();
comp.setURIResolver(resolver);
Source source = resolver.resolve("iso_svrl_for_xslt2.xsl", null);
XsltExecutable executable = comp.compile(source);
XsltTransformer transformer = executable.load();
transformer.setSource(new StreamSource(new ByteArrayInputStream(schema)));
Serializer serializer = new Serializer();
serializer.setOutputStream(new ByteArrayOutputStream());
transformer.setDestination(serializer);
transformer.transform(); // Errors appear in logs during this line
// ...
Source
是javax.xml.transform.Source
。XSL 相关的类都来自 SAXON ( Javadoc )。
我能做些什么来解决这个问题?移动bar.xml
到程序正在查找它的位置并进行编辑style.xsl
对我来说不是选项,因为这两个文件都属于第三方库。
更新:
进一步的研究使我相信我需要设置StreamSource
. 我尝试用transformer.setSource(...
这个替换该行:
StreamSource strSrc = new StreamSource(new ByteArrayInputStream(schema));
strSrc.setSystemId(new
File("C:\\one\\two\\three\\four\\five\\six\\S\\P\\schema.sch").toURI()
.toURL().toExternalForm());
transformer.setSource(strSrc);
但我得到了相同的结果。我使用setSystemId()
不正确吗?我是否完全走错了路?