
The somewhat functional way of thinking involved with jOOX’s
XML manipulation cries for an additional API enhancement simply supporting XSLT.
XSL transformation has become quite a standard way of transforming large amounts of XML into other structures, where normal DOM manipulation (or jOOX manipulation) becomes too tedious. Let’s have a look at how things are done in standard Java
Example input:
<books>
<book id="1"/>
<book id="2"/>
</books>
Example XSL:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Match all books and increment their IDs -->
<xsl:template match="book">
<book id="{@id + 1}">
<xsl:apply-templates/>
</book>
</xsl:template>
<!-- Identity-transform all the other elements and attributes -->
<xsl:template match="@*|*">
<xsl:copy>
<xsl:apply-templates select="*|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Verboseness of XSL transformation in Java
The standard way of doing XSL transformation in Java is pretty verbose – as just about anything XML-related in standard Java. See an example of how to apply the above transformation:
Source source = new StreamSource(new File("increment.xsl"));
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(source);
DOMResult result = new DOMResult();
transformer.transform(new DOMSource(document), result);
Node output = result.getNode();
Drastically decrease verbosity with jOOX
With jOOX, you can write exactly the same in much less code:
Apply transformation:
// Applies transformation to the document element:
$(document).transform("increment.xsl");
// Applies transformation to every book element:
$(document).find("book").transform("increment.xsl");
The result in both cases is:
<books>
<book id="2"/>
<book id="3"/>
</books>
Like this:
Like Loading...
Published by lukaseder
I made jOOQ
View all posts by lukaseder
I have used XSLT many times in the past and hate it for it’s verboseness and how hard it makes it to do simple things such as calling macros.
Take freemarker’s XML support for a spin and I’m sure you’ll find it to be much simpler, easier to read, less verbose and more powerful than XSLT. It has great XML support including XPath (https://freemarker.sourceforge.net/docs/xgui_imperative_learn.html)
That looks quite interesting! Does Freemarker implement javax.xml.transform.Transformer? Then, Freemarker could be used with jOOX in the way I described above
javax.xml.transform.Transformer expects XML as the input. Freemarker is a generic templating language that can take any object as input. It just happens to have great support for XML inputs. I’m not sure that javax.xml.transform.Transformer is the right fit.