1

此代码使用 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. 连接所有 xml,转换,仅返回过滤连接的辅助 xml 的原始部分

  2. 写一段代码,添加

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

    在 xslt 字符串之上

4

1 回答 1

1

第一件事 - 摆脱所有 DOM 的东西!将 DOM 与 Saxon 一起使用会使其速度减慢十倍。让 Saxon 使用 StreamSource 或 SAXSource 和 StreamResult 以自己的格式构建树。或者,如果需要,您可以使用 s9api DocumentBuilder 类自己构建撒克逊格式的树。

那么关于你的问题的答案:这里有三种可能的解决方案:

(a) 将文档作为 document-node()* 类型的样式表参数提供(即文档节点序列)。在 Java 中,通过在每个节点上调用 Configuration.buildDocument() 将您的 XML 字符串列表转换为文档节点列表。

(b) 编写一个 URIResolver,其作用是将 URI doc/3 解释为列表中的第三个文档;然后使用 document('doc/3') 获取该文档。

(c) 编写一个 CollectionURIResolver,它使用 collection() 函数使整个文档集合可用。

于 2013-06-10T21:14:32.123 回答