2012-09-26 20 views
0

我寫了一個xslt for xalan,與xalan cli(org.apache.xalan.xslt.Process)一起工作正常。 xslt使用xalan擴展redirect它確實生成了幾個像預期的xml文件。是否有可能使用javax.xml.transform.Transformer與xslt包含一些xalan:重定向?

現在我想從Java應用程序進行轉換。我查看了org.apache.xalan.xslt.Process源代碼,它有點複雜(if/then/else有1000行)。我找不到文檔。我正在查看調用轉換的最小代碼並可能設置輸出目錄。

我想是這樣的:

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,並知道所有輸出文件的最終位置?

回答

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"> 
... 

現在,我可以看到他們都應該輸出文件成爲。

相關問題