我为 xalan 编写了一个xslt,它可以很好地处理xalan (org.apache.xalan.xslt.Process
)。xslt使用xalan扩展redirect
,它确实生成了几个像预期一样的xml文件。
现在,我想从Java应用程序进行转换。我看了一下org.apache.xalan.xslt.Process源代码,它有点复杂(1,000行if/if/ bit )。我找不到文件。我正在查看调用转换的最小代码,并可能设置输出目录。
我试过这样的方法:
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是什么?
发布于 2012-09-27 09:35:03
实际上代码运行得很好。这只是因为我没有提供到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">
...
现在,我可以看到它们应该在哪里的输出文件。
https://stackoverflow.com/questions/12609438
复制