Hello!
I'm designing a servlet class that merges an xml file and xsl file into html that will be sent to the client. But I don't understand how the (sparsely documented) javax.xml.transform.dom package works. An exception is generated for a missing "version" tag, when I've included one that has worked on client-side xml/xsl pages before. If it matters, I'm using Apache Tomcat/JDK 1.4.
Here's the code:
package mypackage.servlet.xml;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
public class XML2HTMLServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
try {
openFile("D:/Webdev/xml2html/data.xml", "D:/Webdev/xml2html/style.xsl", writer);
} catch (Exception e) {
e.printStackTrace(writer);
}
}
private void openFile(String xmlPath, String xslPath, PrintWriter writer)
throws IOException, ParserConfigurationException, SAXException,
TransformerConfigurationException, TransformerException {
File xmlFile = new File(xmlPath);
File xslFile = new File(xslPath);
TransformerFactory tFact = TransformerFactory.newInstance();
DocumentBuilderFactory dbFact = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbFact.newDocumentBuilder();
Document xmlDoc = builder.parse(xmlFile);
Document xslDoc = builder.parse(xslFile);
Node xmlDocNode = (Node)xmlDoc;
Node xslDocNode = (Node)xslDoc;
DOMSource xmlSrc = new DOMSource(xmlDocNode);
DOMSource xslSrc = new DOMSource(xslDocNode);
DOMResult htmlResult = new DOMResult();
Transformer transformer = tFact.newTransformer(xslSrc); // the exception occurs here!
}
}
When it runs, it complains:
javax.xml.transform.TransformerConfigurationException:
javax.xml.transform.TransformerConfigurationException:
javax.xml.transform.TransformerException:
javax.xml.transform.TransformerException: stylesheet requires attribute: version at
org.apache.xalan.processor.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:767) at
mypackage.servlet.xml.XML2HTMLServlet.openFile(XML2HTMLServlet.java:49) at
...etc...etc...
data.xml contains:
<?xml version="1.0"?>
<document type="lecture">
<title>Test Data</title>
<section>
<name>A New Section</name>
</section>
</document>
style.xsl contains:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title><xsl:value-of select="document/title"/></title>
</head>
<body>
<xsl:apply-templates select="document/section"/>
</body>
</html>
</xsl:template>
<xsl:template match="section">
<div><i>Section</i><br/><xsl:value-of select="name"/></div>
</xsl:template>
</xsl:stylesheet>
I'm not sure the method calls above are what I want, so here's the client-side equivalent in Internet Explorer 5.0:
function createStyledXMLDocument(xmlUrl, xslUrl) {
var xmlDocument = new ActiveXObject("Microsoft.XMLDOM");
xmlDocument.load(xmlUrl);
var xslDocument = new ActiveXObject("Microsoft.XMLDOM");
xslDocument.load(xslUrl);
return xmlDocument.transformNode(xslDocument);
}
Any help would be greatly appreciated.