Java 多重xslt转换

Java 多重xslt转换,java,xml,xslt,xml-parsing,Java,Xml,Xslt,Xml Parsing,在输入中,我有xml文件,它可以是1000或100000个文件,我必须将其转换为6个csv文件,以便以后保存到数据库中。我的问题是如何在java中更有效地实现这一点,现在我使用不同的xslt样式表创建了6个转换器,并手动转换xml 6次。我尝试在一个xslt转换中使用function:result-document来实现这一点,但在Input中可能不止一个xml文件,每次转换后,结果文件中的数据都会被重写。我的想法是从csv格式的xml文件中收集所有数据,然后将其复制到db表中 Transfor

在输入中,我有xml文件,它可以是1000或100000个文件,我必须将其转换为6个csv文件,以便以后保存到数据库中。我的问题是如何在java中更有效地实现这一点,现在我使用不同的xslt样式表创建了6个转换器,并手动转换xml 6次。我尝试在一个xslt转换中使用function:result-document来实现这一点,但在Input中可能不止一个xml文件,每次转换后,结果文件中的数据都会被重写。我的想法是从csv格式的xml文件中收集所有数据,然后将其复制到db表中

TransformerFactory tf = TransformerFactory.newInstance();

Transformer transformer = tf.newTemplates(stylesource).newTransformer();
Transformer transformer2 = tf.newTemplates(stylesource2).newTransformer();
Transformer transformer3 = tf.newTemplates(stylesource3).newTransformer();
Transformer transformer4 = tf.newTemplates(stylesource4).newTransformer();
Transformer transformer5 = tf.newTemplates(stylesource5).newTransformer();
Transformer transformer6 = tf.newTemplates(stylesource6).newTransformer();

DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();

public void transformXmlToCsv(String content) throws TransformerException, IOException, SAXException {
    Document doc = db.parse(new InputSource(new StringReader(content)));
    Source source = new DOMSource(doc);

    transformer.transform(source, outputTarget);
    transformer2.transform(source, outputTarget2);
    transformer3.transform(source, outputTarget3);
    transformer4.transform(source, outputTarget4);
    transformer5.transform(source, outputTarget5);
    transformer6.transform(source, outputTarget6);
}

您可以做的一个改进是通过构建一次输入树来避免重复解析源文档。例如,通过构建DOM树并使用DOMSource,或者如果使用Saxon更好,通过使用Saxon接口以Saxon的内部格式构建树一次

另一个改进是只为所有产品创建一个TransformerFactory。创建TransformerFactory通常成本很高,它需要搜索类路径,并且不需要创建多个


用xsl:result文档解决问题应该很容易。有很多方法可以做到这一点,例如,通过将每个转换的输出定向到不同的目录,但是如果没有更多信息,我无法判断最好的方法是什么。

Ok,我将只创建一个实例TransformerFactory。关于DomSource,我认为它会影响性能,在输入中,我有大小为1-10mb的xml文件,dom将整个文件加载到内存中。关于结果文档如果我可以将多个转换的结果附加到一个文件中,它可以解决我的问题。但我不知道怎么做,XSLT处理器无论如何都会在内存中构建一棵树。它可能会构建一个比DOM更高效的树,但您只需要构建一次树;这样做的方式取决于您使用的XSLT处理器。使用xsl:result文档执行追加操作是一个有趣的主题,可能是一个新问题;答案可能取决于产品。我添加了DOM,提高了性能。我正在使用javax.xml.transform.dom.DOMSource;也许你知道更快的实现?关于结果文档的问题很有趣,我们可以在这里讨论吗,我如何添加结果?性能的提高意味着时间的增加还是速度的提高?在讨论性能之前,您还没有说明您使用的是哪个XSLT处理器,这是非常重要的。至于结果文件,我认为它值得一个新的问题。速度提高了。使用3个线程和streamSoruce处理100000个xml文件花费20分钟,使用dom处理10-12分钟。Xslt处理器是net.sf.saxon.jaxp。TransformerImpl@23941fb4. 撒克逊河-9.9.1-6