我的程序从不是项目根目录的位置读取文档。 doc包含相对路径。当程序应用该路径时,它确实从项目的根目录开始。如何使其应用文档原始位置的路径?
以下是详细信息。有点长,但很简单。
我在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
,对我来说不是选项,因为这两个文件都属于第三方库。
更新
进一步的研究使我相信我需要set the system ID of the 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()
了吗?我完全走错了路吗?
答案 0 :(得分:0)
我没有安装java,但我认为你需要更改解析器,找到你想要的路径。
你没有告诉你如何得到它。当然,您可以执行快速和脏操作,只需在参数选项卡下的调试配置中更改工作目录即可。但我认为你不想这样做