现在我正在使用这个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来引用该对象。
有办法吗?我如何参考
用这种方式在我的XSLT中f2.xml
?
答案 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来预构建树。