tags:

views:

71

answers:

2

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.

+3  A: 

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.

Flynn1179
+2  A: 
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.

Dimitre Novatchev