
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:
http://exslt.org
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());
}
Like this:
Like Loading...
Published by lukaseder
I made jOOQ
View all posts by lukaseder