转换多个输入文件

时间:2014-01-20 10:57:26

标签: java xslt saxon

现在我正在使用这个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'),而是使用我的Java方法中收到的f2来引用该对象。

有办法吗?我如何参考

  

f2.xml

用这种方式在我的XSLT中

1 个答案:

答案 0 :(得分:1)

我不完全确定f1,f2等是什么。它是文档的URL吗?或XML文档内容本身?

您可以考虑两种可能的方法。

一个是编写URIResolver。当你调用document('f2.xml')时,Saxon会调用你的URIResolver来获取相关文档作为Source对象。您的URIResolver可以返回使用ByteArrayInputStream初始化的StreamSource,引用相关的btye []值。

第二种方法是将文档作为参数提供给样式表。您可以声明全局参数<xsl:param name="f2" as="document-node()"/>,然后使用Transfomer.setParameter()来提供实际文档;在样式表中,将document('f2.xml')替换为$f2。 Saxon将接受一个Source对象作为提供给setParameter的值,因此您可以再次创建一个使用ByteArrayInputStream初始化的StreamSource,引用相关的btye []值;或者(也许更好)你可以通过调用Saxon DocumentBuilder来预构建树。