Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to apply xsl to xml in Java

Tags:

java

xml

xslt

This is problaby been asked a bunch of times, but I didn't really find what I was looking for exactly. I don't normally code in Java, but in C# so I am not comfortable with Java classes and such.

Question

I need to create a method that takes 2 paramaters. 1. A string parameter (the xml - so needs to be converted to some xml class) 2. A string parameter with the xsl file path location

The thing is I am making a factory class that must convert xml from a webservice into xml that my system can understand. I need a nice solution for that. Every method on the ws will have a xsl file - both the request (convert my xml to something that the ws understands) and the response (convert to something that my system understands).

like image 207
user750508 Avatar asked May 12 '11 12:05

user750508


2 Answers

You might find the Java Almanac a useful resource.

notably The Quintessential Program That Transforms an XML File with XSL. Example copied from the page (as it keeps disappearing)

import java.io.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;

public class BasicXsl {
    // This method applies the xslFilename to inFilename and writes
    // the output to outFilename.
    public static void xsl(String inFilename, String outFilename, String xslFilename) {
        try {
            // Create transformer factory
            TransformerFactory factory = TransformerFactory.newInstance();

            // Use the factory to create a template containing the xsl file
            Templates template = factory.newTemplates(new StreamSource(
                new FileInputStream(xslFilename)));

            // Use the template to create a transformer
            Transformer xformer = template.newTransformer();

            // Prepare the input and output files
            Source source = new StreamSource(new FileInputStream(inFilename));
            Result result = new StreamResult(new FileOutputStream(outFilename));

            // Apply the xsl file to the source file and write the result
            // to the output file
            xformer.transform(source, result);
        } catch (FileNotFoundException e) {
        } catch (TransformerConfigurationException e) {
            // An error occurred in the XSL file
        } catch (TransformerException e) {
            // An error occurred while applying the XSL file
            // Get location of error in input file
            SourceLocator locator = e.getLocator();
            int col = locator.getColumnNumber();
            int line = locator.getLineNumber();
            String publicId = locator.getPublicId();
            String systemId = locator.getSystemId();
        }
    }
}

Sample input:

<?xml version="1.0" encoding="UTF-8"?>
<map>
    <entry key="key1" value="value1" />
    <entry key="key2" />
</map>

Sample XSLT program:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" indent="yes"/>

<xsl:template match="map">
<HTML>
<HEAD>
<TITLE>Map</TITLE>
</HEAD>
<BODY>
    <xsl:apply-templates/>
</BODY>
</HTML>
</xsl:template>


<xsl:template match="entry">
    <xsl:value-of select="@key"/>=<xsl:value-of select="@value"/>
    <br></br>
</xsl:template>


</xsl:stylesheet>

The resulting HTML from running the example is:

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>Map</TITLE>
</HEAD>
<BODY>
    key1=value1<br>
    key2=<br>

</BODY>
</HTML>
like image 190
Thorbjørn Ravn Andersen Avatar answered Oct 12 '22 19:10

Thorbjørn Ravn Andersen


Google for "JAXP tutorial" - there are lots of resources available.

Though if you want to use XSLT 2.0 (and believe me, you do!), you'll be using Saxon, and Saxon offers both JAXP and its own API (called s9api) which helps you take advantage of all the new features in XSLT 2.0.

like image 1
Michael Kay Avatar answered Oct 12 '22 19:10

Michael Kay