Directive that evaluates xpath against org.w3c.dom.Node by Vladimir Kirichenko <vladimir.kirichenko#gmail.com>
package org.apache.velocity.runtime.directive;
import org.apache.velocity.context.InternalContextAdapter;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.directive.Directive;
import org.apache.velocity.runtime.parser.node.Node;
import org.apache.xpath.XPathAPI;
import javax.xml.transform.TransformerException;
import java.io.IOException;
import java.io.Writer;
public class XPath extends Directive {
public String getName() {
return "xpath";
}
public int getType() {
return LINE;
}
public boolean render( InternalContextAdapter context, Writer writer, Node node ) throws IOException, ResourceNotFoundException, ParseErrorException, MethodInvocationException {
String var = node.jjtGetChild( 0 ).getFirstToken().image.substring( 1 );
org.w3c.dom.Node document = ( org.w3c.dom.Node ) node.jjtGetChild( 1 ).value( context );
String xpath = String.valueOf( node.jjtGetChild( 2 ).value( context ) );
try {
context.put( var, XPathAPI.eval( document, xpath ) );
} catch( TransformerException e ) {
throw new IOException( "cannot evaluate xpath: " + e.getMessage() );
}
return true;
}
}Example: #xpath($result $doc '/my/x/path')