Use Xalan's extension functions natively in jOOX
Join the DZone community and get the full member experience.
Join For FreejOOX 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()); }
From http://lukaseder.wordpress.com/2012/01/24/use-xalans-extension-functions-natively-in-joox/
Opinions expressed by DZone contributors are their own.
Comments