私のプログラムは、プロジェクトのルート ディレクトリではない場所からドキュメントを読み込みます。ドキュメントには相対パスが含まれています。プログラムがそのパスを適用すると、プロジェクトのルート ディレクトリから開始されます。ドキュメントの元の場所からのパスを適用するにはどうすればよいですか?
詳細はこちら。ちょっと長いですが、かなり簡単です。
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
を設定する必要があると確信しました。私はこれで行を置き換えてみました: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()
間違って使用していますか?私は完全に間違った道を進んでいますか?