Umesh Kacha
Umesh Kacha

Reputation: 13686

XPath query how to get value of one attribute based on two attribute

I want to extract name attribute value from the following tag

<application
    comments="Do not erase this one"
    executable="run_CIET"
    icon="default"
    instances="1"
    mode="1"
    name="CIET"
    order="10"
    selection="1"
    tool="y"
/>

I can easily get value of name attribute value based on mode value as shown below

xpath Applications.xml '//applications/application[@mode='3']'/@name

But if I want to add more condtion which is "get name attribute value when mode=X and tool attribute is not there in application tag"

How do we do this? I tried something like

xpath Applications.xml '//applications/application[@mode='3' and !@tool]'/@name

but its not working.

I have not used XPath before and I am finding it tricky I search W3C help on XPath but did not find what I wanted. Please help.

Upvotes: 13

Views: 36373

Answers (2)

Dimitre Novatchev
Dimitre Novatchev

Reputation: 243549

How do we do this? I tried something like 

    xpath Applications.xml '//applications/application[@mode='3' and !@tool]'/@name

but its not working.



!@tool

is invalid syntax in XPath. There is an != operator, but no ! operator.

Use:

//applications/application[@mode='3' and not(@tool)]/@name 

There are two things you should always try to avoid:

  1. using the != operator -- it has weird definition and doesn't behave like the not() function --never use it if one of the operands is a node-set.

  2. Try to avoid as much as possible using the // abbreviation -- this may cause signifficant inefficiency and also has anomalous behavior that isn't apperent to most people.

Upvotes: 18

Flynn1179
Flynn1179

Reputation: 12075

Using not(@tool) instead of !@tool should do the job. If your XPath engine's not behaving you could conceivably do count(@tool)=0, but that shouldn't be necessary.

Upvotes: 6

Related Questions