xmlxpathaxiomxpath-1.0

How to pass variable parameter into XPath expression?


I want to pass a parameter into an XPath expression.

(//a/b/c[x=?],myParamForXAttribute)

Can I do this with XPath 1.0 ? (I tried string-join but it is not there in XPath 1.0)

Then how can I do this ?

My XML looks like

<a>
 <b>
  <c>
   <x>val1</x>
   <y>abc</y>
  </c>
  <c>
   <x>val2</x>
   <y>abcd</y>
  </c>
</b>
</a>

I want to get <y> element value where x element value is val1

I tried //a/b/c[x='val1']/y but it did not work.


Solution

  • 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:


    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