jOOX aims at increased ease of use when dealing with Java’s rather complex XML API’s. One example of such a complex API is Xalan, which has a lot of nice functionality, such as its extension namespaces. When you use Xalan, you may have heard of those extensions as documented here:
These extensions can typically be used in XSLT. An example is the math:max function:
<!-- Source --> <values> <value>7</value> <value>11</value> <value>8</value> <value>4</value> </values> <!-- Stylesheet --> <xsl:template match="values"> <result> <xsl:text>Maximum: </xsl:text> <xsl:value-of select="math:max(value)" /> </result> </xsl:template> <!-- Result --> <result>Maximum: 11</result>
But in fact, math:max can be used in any type of XPath expression, also the ones that are directly created in Java. Here’s how you can do this:
Document document = // ... this is the DOM document // Create an XPath object XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); // Initialise Xalan extensions on the XPath object xpath.setNamespaceContext( new org.apache.xalan.extensions.ExtensionNamespaceContext()); xpath.setXPathFunctionResolver( new org.apache.xalan.extensions.XPathFunctionResolverImpl()); // Evaluate an expression using an extension function XPathExpression expression = xpath.compile( "//value[number(.) = math:max(//value)]"); NodeList result = (NodeList) expression.evaluate( document, XPathConstants.NODESET); // Iterate over results for (int i = 0; i < result.getLength(); i++) { System.out.println(result.item(i).getTextContent()); }
jOOX is much more convenient
The above is pretty verbose. With jOOX, you can do exactly the same, but with a lot less code:
Document document = // ... this is the DOM document // jOOX's xpath method already supports Xalan extensions for (Match value : $(document).xpath( "//value[number(.) = math:max(//value)]").each()) { System.out.println(value.text()); }