尝试在java中将xslt应用于xml

尝试在java中将xslt应用于xml,java,xml,xslt,Java,Xml,Xslt,我一直在开发一个将表的内容打印为XML的Web服务——我使用了一个WebRowSet来实现这一点 response.setContentType("text/xml"); WebRowSet webRowSet = new WebRowSetImpl(); webRowSet.writeXml(resultSet, response.getWriter()); (HttpServletResponse) 虽然这样做很好,但我根本不知道如何将样式表应用于XML。我试着用变压器来做这个 webRo

我一直在开发一个将表的内容打印为XML的Web服务——我使用了一个WebRowSet来实现这一点

response.setContentType("text/xml");
WebRowSet webRowSet = new WebRowSetImpl();
webRowSet.writeXml(resultSet, response.getWriter());
(HttpServletResponse)

虽然这样做很好,但我根本不知道如何将样式表应用于XML。我试着用变压器来做这个

webRowSet.writeXml(resultSet, OutputStream);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(new StreamSource("file.xsl"));
transformer.transform(new StreamSource(InputStream), 
                      new StreamResult(response.getWriter()));
我无法理解writeXml中的OutputStream和StreamSource中的InputStream是什么。(我不想将数据保存在文件中)


如果您能解释一下如何解决这个问题,我们将不胜感激。

您可以让
webRowSet
将其XML写入a(最好包装在a中以便缓冲)


接下来,您可以指示您的
转换器
从中读取,并使用从
ByteArrayOutputStream
获得的
字节[]
对其进行实例化。您有以下步骤:
WebRowSet
将数据作为xml写入输出流-->以某种方式将其转换为输入流-->将输入流传递给转换器,然后将结果写入响应

第二步很棘手。实现的方法之一是如您所述写入文件。您还可以使用
ByteArrayOutputStream
将其写入内存:

ByteArrayOutputStream tempStream = new ByteArrayOutputStream();
webRowSet.writeXml(resulSet, tempStream);
...
transformer.transform(new StreamSource(new ByteArrayInputStream(tempStream.toByteArray())),
                      new StreamResult(response.getWriter()));

除非您有无法放入内存的大型xml,否则它应该可以工作。通过这种方式,您可以写入文件,也可以查找不写入内存的解决方案。

请简要说明有关流的问题:web服务器也使用流来写入数据,如代码最后一行所示


转换对象写入的输出流是响应流。

看起来您真正想要做的是从结果集中获取部分/所有字段,并将其写入已知的输出格式

根据要输出的数据的复杂性,除了使用XSL,您还可以将结果集中的数据获取到Java的集合对象中,并将该数据传递给模板引擎,如Velocity或FreeMarker

您的Velocity/Freemarker模板将(更多或更少)采用预期输出的格式,因此更易于维护


另一方面,如果resultset中的数据相当丰富,那么您的数据结构就会变得复杂,您可能希望在将数据传递到模板引擎之前创建JavaBean来表示数据。这将是更多的工作,但您需要平衡它与编写和维护XSL的工作。

@Shishigami,太好了,然后接受mthmulders'(他是第一个)或我的答案