gpt4 book ai didi

java - 将 XSLT 输出写入内存中的多个对象

转载 作者:行者123 更新时间:2023-12-01 20:04:05 28 4
gpt4 key购买 nike

我正在使用 XSLT 并将结果写入 Java 中的多个输出,如以下链接所述: link1 , link2

在写入文件时,一切都运行良好,但现在我想将输出 XML 存储为 Document 对象或某种 InputStream/String - 除了驱动器上的文件之外的任何内容。使用 Transformer 将文档写入文件,然后读取对象(文档、字符串等) 不是一个选项

我的问题是:我应该在 xslt 映射和 java 代码中更改什么才能将输出作为对象而不是驱动器上的文件获取。 (我想到的唯一解决方案是在这个 XML 上使用两个 XSLT,但这不是一种优雅的方式)

我的Java代码与上面链接中的答案类似。我正在使用 XSLT 2.0 并使用以下方法进行转换:

transformer.transform(xmlText, new DOMResult());

我还添加了

  <xsl:result-document href="{concat($jobName, '_assets.xml')}">
<xsl:apply-templates select="GetMetadata/Metadata" mode="assets"/>
</xsl:result-document>
<xsl:result-document href="{concat($jobName, '_flows.xml')}">
<xsl:apply-templates select="GetMetadata/Metadata" mode="flows"/>
</xsl:result-document>

到我的 xsl 映射 [写入文件工作正常]

稍后

正确实现:(谢谢迈克尔)

public void multipleXMLExtractor(Document inputDom, String xsltPath) throws TransformerException, UnsupportedEncodingException {

Source xmlInput = new DOMSource(inputDom);
Source xsltMap = new StreamSource(new File(xsltPath));
final Map<String, StreamResult> resultsMap = new HashMap<String, StreamResult>();
resultsMap.put("output1", new StreamResult(new ByteArrayOutputStream()));
resultsMap.put("output2", new StreamResult(new ByteArrayOutputStream()));

TransformerFactory tFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", XMLviaXSLTransformer.class.getClassLoader());
Transformer transformer = tFactory.newTransformer(xsltMap);
((net.sf.saxon.jaxp.TransformerImpl) transformer).getUnderlyingController().setOutputURIResolver(new OutputURIResolver() {
@Override
public OutputURIResolver newInstance() {
return this;
}

@Override
public Result resolve(String s, String s1) throws TransformerException {
return resultsMap.get(s);
}

@Override
public void close(Result result) throws TransformerException {
}
});

StreamResult standardResult = new StreamResult(new ByteArrayOutputStream());
transformer.transform(xmlInput, standardResult);


for (Map.Entry<String, StreamResult> stringStreamResultEntry : resultsMap.entrySet()) {
System.out.println(stringStreamResultEntry.getKey() + ": " + ((ByteArrayOutputStream) stringStreamResultEntry.getValue().getOutputStream()).toString("UTF-8"));
}

}

最佳答案

您需要定义一个 OutputURIResolver - 这是一个特定于 Saxon 的接口(interface),调用它来确定 xsl:result-document 输出的目标。它被给予一个 URI 作为输入,并返回一个 JAXP Result 对象,结果文档将写入该对象。

https://www.saxonica.com/documentation/index.html#!javadoc/net.sf.saxon.lib/OutputURIResolver

如果您使用 JAXP API 来控制转换,则必须将 Transformer 对象强制转换为 net.sf.saxon.jaxp.TransformerImpl,然后调用 getUnderlyingController( ).setOutputURIResolver(),提供您的 OutputURIResolver 作为参数。

关于java - 将 XSLT 输出写入内存中的多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47652132/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com