4

私のプログラムは、プロジェクトのルート ディレクトリではない場所からドキュメントを読み込みます。ドキュメントには相対パスが含まれています。プログラムがそのパスを適用すると、プロジェクトのルート ディレクトリから開始されます。ドキュメントの元の場所からのパスを適用するにはどうすればよいですか?

詳細はこちら。ちょっと長いですが、かなり簡単です。

Eclipse に Java プロジェクトがあります。

C:\one\two\three\four\five

このプログラムは、Schematron スキーマを入力として受け取り、新しい XSLT スタイルシートを出力として生成する XSL 変換を実行します。スキーマは次の場所にあります。

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

更新:さらに調査した結果、のシステム ID
を設定する必要があると確信しました。私はこれで行を置き換えてみました:StreamSourcetransformer.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 に答える