使用Saxon9HE API在Java应用程序中使用XSLT转换多个输入XML文档

时间:2016-06-21 08:53:19

标签: java xml xslt saxon

如何在Java应用程序中使用Saxon9HE处理器使用单个XSL转换脚本转换多个XML输入文档对象?

我找到了一种使用XSLT脚本here从文件系统转换多个XML输入文件的方法,但我无法弄清楚如何使用Saxon9HE将多个加载的XML Document对象传递给Java应用程序API。对于单个XML文档,我的代码看起来像这样并起作用:

    Processor proc = new Processor(false);

    XsltCompiler comp = proc.newXsltCompiler();

    try {
        XsltExecutable exp = comp.compile(new StreamSource(stylesheetFile));

        XdmNode source = proc.newDocumentBuilder().build(new DOMSource(inputXML));          
        Serializer out = proc.newSerializer();

        out.setOutputProperty(Serializer.Property.METHOD, "xml");
        out.setOutputProperty(Serializer.Property.INDENT, "yes");
        out.setOutputFile(new File(outputFilename));

        XsltTransformer trans = exp.load();

        trans.setInitialContextNode(source);
        trans.setDestination(out);
        trans.transform();
    } catch (SaxonApiException e) {
        e.printStackTrace();
    }

1 个答案:

答案 0 :(得分:0)

第一点:如果可以,请避免使用DOM。当你使用Saxon时,最好让Saxon构建文档树;这将更有效率。如果您确实需要使用外部树模型,则XOM和JDOM2比DOM更有效。

如果你想提供一个DOM作为输入,你有两个选择:你可以将它复制到撒克逊树,或者你可以将它包装成撒克逊树。在第一种情况下使用DocumentBuilder.build(),在第二种情况下使用DocumentBuilder.wrap()。使用build()会为您带来更高的初始成本,但转换本身会更快。

如果要将预构建的树传递到转换中,请使用<xsl:param name="x" as="document-node()"/>声明参数,然后使用transformer.setParameter(new QName('x'), doc)调用转换,其中doc是XdmNode的实例。您必须使用DocumentBuilder自己构建XdmNode。

(或者,如果您想使用doc()或document()函数访问样式表中的文档,您可以创建一个URI命名方案并在URIResolver中实现它。当doc('my:uri')时调用,你的URIResolver会被通知,它应该响应一个Source对象。如果你已经有一个XdmNode方便,那么你可以返回XdmNode.asSource()来返回你的URIResolver结果的这个文档树。)