多重xslt转换

Multiple xslt tranformations

在输入中,我有 xml 个文件(可以是 1000 或 100000 个文件),我必须将其转换为 6 个 csv 文件,以便稍后保存到数据库中。我的问题是如何在 java 中更有效地执行此操作,现在我创建了 6 个具有不同 xslt 样式表的转换器并手动转换 xml 6 次。我尝试在一个带有函数的 xslt 转换中执行此操作:result-document,它可以工作,但在输入中可能有多个 xml 文件,并且在每次转换后结果文件中的数据都会重写。我的想法是从 csv 中的 xml 个文件中收集所有数据,然后将其复制到数据库表中。

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-document 应该很容易解决您的问题。有很多方法可以做到这一点,例如通过将每个转换的输出定向到不同的目录,但如果没有更多信息,我无法确定最佳方法。