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
<?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");