ProblemYou need to make significant changes to the output format. SolutionUse XSLT; it is fairly easy to use and does not require writing much Java. DiscussionXSLT, the Extensible Stylesheet Language for Transformations, allows you a great deal of control over the output format. It can be used to change an XML file from one vocabulary into another, as might be needed in a business-to-business (B2B) application where information is passed from one industry-standard vocabulary to a site that uses another. It can also be used to render XML into another format such as HTML. Some open source projects even use XSLT as a tool to generate Java source files from an XML description of the required methods and fields. Think of XSLT as a scripting language for transforming XML. This example uses XSLT to transform a document containing people's names, addresses, and so on such as the file people.xml, shown in Example 21-2 into printable HTML. Example 21-2. people.xml<?xml version="1.0"?> <people> <person> <name>Ian Darwin</name> <email>http://www.darwinsys.com/contact.html</email> <country>Canada</country> </person> <person> <name>Another Darwin</name> <email type="intranet">afd@node1</email> <country>Canada</country> </person> </people> You can transform the people.xml file into HTML by using the following command: $ java JAXPTransform people.xml people.xsl people.html The output is something like the following: <html> <head> <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Our People</title> </head> <body> <table border="1"> <tr> <th>Name</th><th>EMail</th> </tr> <tr> <td>Ian Darwin</td><td>http://www.darwinsys.com/</td> </tr> <tr> <td>Another Darwin</td><td>afd@node1</td> </tr> </table> </body> </html> Figure 21-2 shows the resulting HTML file opened in a browser. Figure 21-2. XML to HTML final result![]() Let's look at the file people.xsl (shown in Example 21-3). Since an XSL file is an XML file, it must be well-formed according to the syntax of XML. As you can see, it contains some XML elements but is mostly (well-formed) HTML. Example 21-3. people.xsl<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <head><title>Our People</title></head> <body> <table border="1"> <tr> <th>Name</th> <th>EMail</th> </tr> <xsl:for-each select="people/person"> <tr> <td><xsl:value-of select="name"/></td> <td><xsl:value-of select="email"/></td> </tr> </xsl:for-each> </table> </body></html> </xsl:template> </xsl:stylesheet> I haven't shown the JAXPTransform program yet. To transform XML using XSL, you use a set of classes called an XSLT processor . Java has included this since JDK 1.4, as part of JAXP. Another freely available XSLT processor is the Apache XML Project's Xalan (formerly available from Lotus/IBM as the Lotus XSL processor). To use JAXP's XSL transformation, you create an XSL processor by calling the factory method TransformerFactory.newInstance( ).newTransformer( ), passing in a Streamsource for the stylesheet. You then call its transform( ) method, passing in a StreamSource for the XML document and a StreamResult for the output file. The code for JAXPTransform appears in Example 21-4. Example 21-4. JAXPTransform.javaimport java.io.File; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; /** Illustrate simple use of JAXP to transform using XSL */ public class JAXPTransform { public static void main(String[] args) throws Exception { if (args.length != 3) { // Create a transformer object Transformer tx = TransformerFactory.newInstance( ).newTransformer( new StreamSource(new File(args[1]))); // not 0 // Use its transform( ) method to perform the transformation tx.transform( new StreamSource(new File(args[0])), new StreamResult(new File(args[2]))); } } See AlsoA recent development is the use of translets. Sun has developed a program that reads a stylesheet and generates a Translet class, which is a compiled Java program that transforms XML according to the stylesheet. This eliminates the overhead of reading the stylesheet each time a document is translated. Translets have been incorporated under the name XSLTC into the Apache XML Xerces-Java project; see http://xml.apache.org/xerces-j/. |