0

xalanのxsltを作成しました。これは、xalan cli(org.apache.xalan.xslt.Process)で正常に機能します。xsltはxalan拡張子を使用しredirectます。期待どおりにいくつかのxmlファイルを生成します。

次に、Javaアプリケーションからの変換を行います。org.apache.xalan.xslt.Processのソースコードを調べましたが、少し複雑です(1,000行のif / then / else)。ドキュメントが見つかりませんでした。トランスフォームを呼び出し、出力ディレクトリを設定するための最小限のコードを調べています。

私は次のようなことを試しました:

    final ByteArrayOutputStream out = new ByteArrayOutputStream();
    InputStream in = null;
    InputStream xsl = null;
    try {
        in = inputFileStream;
        xsl = url.openStream();
        final TransformerFactory tFactory = TransformerFactory
                .newInstance();
        final Transformer transformer = tFactory
                .newTransformer(new StreamSource(xsl));
        transformer.transform(new StreamSource(in), new StreamResult(out));
    } catch (Throwable t) {
        Activator.logErrorMessage(NLS.bind(
                Messages.Import_XSLT_TRANSFORMATION_FAILED, t.toString()));
    } finally {
        IOUtils.closeQuietly(xsl);
        IOUtils.closeQuietly(in);
        IOUtils.closeQuietly(out);
    }

単純なxslt(つまり、リダイレクト拡張機能なし)では正常に機能します。リダイレクト拡張子を持つxsltを使用すると、通常の出力は取得されます<?xml version="1.0" encoding="UTF-8"?>が、他の出力ファイルは取得されません(を使用した場合のようにorg.apache.xalan.xslt.Process)。

リダイレクト拡張子を持つxsltを使用して変換し、すべての出力ファイルがどこに到達するかを知るために使用する最小限の呼び出し/ APIは何ですか?

4

1 に答える 1

0

実際、コードは正常に機能していました。へのフルパスを提供していなかっただけなredirect:write file=""ので、出力ファイルが実際に書き込まれたという事実を見逃しました。

javaからxsltにパラメーターを渡しました。

final Transformer transformer = templates.newTransformer();
transformer.setParameter("containerFullPath", containerFullPath);
transformer.transform(new StreamSource(in), new StreamResult(out));

そして、xsltに次の行を追加しました。

<xsl:param name="containerFullPath"/> <!-- at the root of the xslt -->
...
    <redirect:write  file="{$containerFullPath}/{$modelName}-{@name}.bpmn">
...

これで、出力ファイルが存在するはずの場所を確認できます。

于 2012-09-27T17:35:03.813 に答える