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>