是否可以将javax.xml.transform.Transformer与xslt一起使用,其中包含一些xalan:redirect?

时间:2012-09-26 19:59:19

标签: java xslt xalan

我为 xalan 编写了一个xslt,它可以与xalan cli(org.apache.xalan.xslt.Process)一起使用。 xslt使用xalan扩展redirect它确实生成了几个像预期的xml文件。

现在我想从Java应用程序进行转换。我查看了org.apache.xalan.xslt.Process源代码,它有点复杂(1000行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是什么,并知道所有输出文件的最终位置?

1 个答案:

答案 0 :(得分: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">
...

现在,我可以看到它们应该是的输出文件。