4

我的程序从不是项目根目录的位置读取文档。该文档包含一个相对路径。当程序应用该路径时,它确实从项目的根目录开始。如何使其应用文档原始位置的路径?

这是详细信息。有点长,但很简单。

我在 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

    // ...

Sourcejavax.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()不正确吗?我是否完全走错了路?

4

1 回答 1

0

我没有安装 java,但我假设您需要更改解析器,以找到您正在寻找的路径。

你没有展示你是如何得到它的。当然,您可以做的又快又脏,只需在参数选项卡下的调试配置中更改工作目录。但我假设你不想那样做

于 2012-08-22T19:57:42.297 回答