How to pass variable parameter into XPath expression?

Given that you’re using the Axiom XPath library, which in turn uses Jaxen, you’ll need to follow the following three steps to do this in a thoroughly robust manner:

  • Create a SimpleVariableContext, and call context.setVariableValue("val", "value1") to assign a value to that variable.
  • On your BaseXPath object, call .setVariableContext() to pass in the context you assigned.
  • Inside your expression, use /a/b/c[x=$val]/y to refer to that value.

Consider the following:

package com.example;

import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.common.AxiomText;
import org.apache.axiom.om.util.AXIOMUtil;
import org.apache.axiom.om.xpath.DocumentNavigator;
import org.jaxen.*;

import javax.xml.stream.XMLStreamException;

public class Main {

    public static void main(String[] args) throws XMLStreamException, JaxenException {
        String xmlPayload="<parent><a><b><c><x>val1</x><y>abc</y></c>" +
                                        "<c><x>val2</x><y>abcd</y></c>" +
                          "</b></a></parent>";
        OMElement xmlOMOBject = AXIOMUtil.stringToOM(xmlPayload);

        SimpleVariableContext svc = new SimpleVariableContext();
        svc.setVariableValue("val", "val2");

        String xpartString = "//c[x=$val]/y/text()";
        BaseXPath contextpath = new BaseXPath(xpartString, new DocumentNavigator());
        contextpath.setVariableContext(svc);
        AxiomText selectedNode = (AxiomText) contextpath.selectSingleNode(xmlOMOBject);
        System.out.println(selectedNode.getText());
    }
}

…which emits as output:

abcd

Leave a Comment