此代码使用Java并使用Saxon
我正在实现一个转换函数来转换xml和几个辅助xml源 所有输入都不是文件,所以我不能使用document()或其他直接定义文件的方法
String transform(String xml, List<String> secondaryXmls, String xslt);
它输出转换后的xml结果
我成功地将xslt的转换应用到单个xml文件,但是我在应用也使用secondaryXmls的转换时遇到了困难。我已经完成了我的研究,仍然找不到合适的方法来应用这些
这是代码的快照
TransformerFactory tFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl",null);
Document transformerDoc = loadXMLFromString(xslt);
Source transformerSource = new DOMSource(transformerDoc);
Transformer transformer = tFactory.newTransformer(transformerSource);
Document sourceDoc = loadXMLFromString(xml);
Source source = new DOMSource(sourceDoc);
DOMResult result = new DOMResult();
transformer.transform(source, result);
Document resultDoc = (Document) result.getNode();
return getStringFrom(resultDoc);
谢谢!
编辑:
哪种方式更好:
连接所有xmls,转换,只返回过滤连接的辅助xmls的原始部分
编写添加
的代码<xsl:variable name="asd" select="document('asd')">
在xslt字符串
答案 0 :(得分:1)
第一件事 - 摆脱所有DOM的东西!将DOM与Saxon一起使用可将其减慢十倍。让Saxon使用StreamSource或SAXSource和StreamResult以自己的格式构建树。或者,如果需要,您可以使用s9api DocumentBuilder类自己构建一个Saxon格式的树。
然后关于你的问题的答案:这里有三种可能的解决方案:
(a)提供文档作为document-node()*类型的样式表参数(即文档节点序列)。在Java中,通过在每个字符串上调用Configuration.buildDocument()将XML字符串列表转换为文档节点列表。
(b)编写一个URIResolver,其效果是将URI doc / 3解释为列表中的第三个文档;然后使用文档('doc / 3')来获取该文档。
(c)编写一个CollectionURIResolver,它使用collection()函数使整个文档集合可用。