2014-01-20 86 views
0

現在我使用該Java(其接收一個XML文件參數)方法來執行XSLT轉換:轉換多個輸入的文件

static public byte[] simpleTransform(byte[] sourcebytes, int ref_id) { 
    try { 
     StreamSource xmlSource = new StreamSource(new ByteArrayInputStream(sourcebytes)); 
     StringWriter writer = new StringWriter(); 
     transformations_list.get(ref_id).transformer.transform(xmlSource, new StreamResult(writer)); 
     return writer.toString().getBytes("UTF-8"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return new byte[0]; 
    } 
} 

在我的XSLT文件我用document('f2.xml')指其他轉換相關文件。

我想用我的Java這樣(得到多個XML文件):

static public byte[] simpleTransform(byte[] f1, byte[] f2, byte[] f3, int ref_id) 

一個在我的XSLT我不想叫document('f2.xml')但通過使用F2參考對象在我的Java收到方法。

有沒有辦法做到這一點?我如何參考

f2.xml

在我的XSLT中使用這種方式?

+0

@Erwin:感謝您改進縮進和發佈語言!但請不要編輯代碼中的錯誤。這是你應該在評論或答案中指出的內容。 –

回答

1

我不完全確定f1,f2等等是什麼文件的URL?或XML文檔內容本身?

有兩種可能的方法可以考慮。

一個是寫一個URIResolver。當你調用document('f2.xml')時,Saxon會調用你的URIResolver來獲取相關文檔作爲Source對象。您的URIResolver可能會返回一個StreamSource,並使用引用相關btye []值的ByteArrayInputStream進行初始化。

第二種方法是將文檔作爲參數提供給樣式表。您可以聲明全局參數<xsl:param name="f2" as="document-node()"/>,然後使用Transfomer.setParameter()提供實際文檔;在樣式表中,用$f2代替document('f2.xml')。 Saxon將接受一個Source對象作爲提供給setParameter的值,因此您可以再次創建一個使用引用相關btye []值的ByteArrayInputStream初始化的StreamSource;或者(也許更好),您可以通過調用Saxon DocumentBuilder預先構建樹。

+0

給出xml驗證錯誤:屬性「as」不允許出現在xsl:param –

+0

我傾向於假設使用Saxon的人正在使用XSLT 2.0。此錯誤表明您正在使用XSLT 1.0。 (我假設你使用的是撒克遜,因爲你把標籤「薩克森」放在你的問題上。)升級的時間! –