从jsp中读取xsl

时间:2012-05-12 11:54:45

标签: xml jsp xslt

我想从xml文件打开流,然后在jsp文件中使用xsl tranformation。一切似乎都是正确的,但我不知道为什么当我从响应中获取输出时会出现异常。

这是我的代码

<%@page import="javax.xml.transform.*" %>
<%@page import="javax.xml.transform.stream.*" %>
<%@page import="java.io.*" %>
<%

StreamSource xmlSource = new StreamSource( new File(application.getRealPath("foo/cd.xml")));
StreamSource xsltSource = new StreamSource( new File(application.getRealPath("foo/cd.xsl")));

StreamResult fileResult = new StreamResult(response.getOutputStream());
try {
    // Load a Transformer object and perform the transformation
    TransformerFactory tfFactory = TransformerFactory.newInstance();
    Transformer tf = tfFactory.newTransformer(xsltSource);
    tf.transform(xmlSource, fileResult);
} catch(TransformerException e) {
    throw new ServletException("Transforming XML failed.", e);
}

%>

例外是:java.lang.IllegalStateException:已为此响应调用了getOutputStream()

那我怎么能摆脱那个呢?感谢

3 个答案:

答案 0 :(得分:1)

Jstl包含用于执行xsl转换的jsp标记。这使您可以选择执行转换,而无需担心输出流。

Sun提供了一个转换示例here。所以如果你在战争中有jstl:

<%@ taglib prefix="x" uri="http://java.sun.com/jstl/xml" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

<c:import url="foo/cd.xml" var="xmldocument"/>
<c:import url="foo/cd.xsl" var="xslt"/>
<x:transform xml="${xmldocument}" xslt="${xslt}"/>

另一个例子是here

tomcat examples.war 网络应用包含jstl。

答案 1 :(得分:0)

执行JSP时,它会打开响应编写器,将其第一个字符写为文本(所有&lt; %@page ... %>指令之间的换行符)。然后尝试打开响应的输出流,但JSP之前已经完成了。

这种纯Java代码没有理由放在JSP中,这意味着使用JSP标记生成标记。使用servlet来做到这一点。

答案 2 :(得分:0)

我正在尝试pd40的解决方案,但它无效。这些库导入改为:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>

请参阅:https://stackoverflow.com/a/19434154/1590763