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).
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>
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With