从项目目录而不是原始目录应用的相对文件路径

时间:2012-08-22 19:17:39

标签: java xslt path relative-path saxon

我的程序从不是项目根目录的位置读取文档。 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

    // ...

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

1 个答案:

答案 0 :(得分:0)

我没有安装java,但我认为你需要更改解析器,找到你想要的路径。

你没有告诉你如何得到它。当然,您可以执行快速和脏操作,只需在参数选项卡下的调试配置中更改工作目录即可。但我认为你不想这样做