13

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.

1
  • Good question, +1. See my answer for an explanation of your problem, a short and complete solution and some recommendations. :) Commented Oct 6, 2010 at 13:17

2 Answers 2

18
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.

Sign up to request clarification or add additional context in comments.

Comments

6

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.