Saxon / Javax从多个XML文件/字符串转换

时间:2013-06-10 18:49:43

标签: java xml xslt saxon

此代码使用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);

谢谢!

编辑:

哪种方式更好:

  1. 连接所有xmls,转换,只返回过滤连接的辅助xmls的原始部分

  2. 编写添加

    的代码
    <xsl:variable name="asd" select="document('asd')">
    

    在xslt字符串

  3. 之上

1 个答案:

答案 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()函数使整个文档集合可用。