Запрос XPath, как получить значение одного атрибута на основе двух атрибутов

Я хочу извлечь значение атрибута имени из следующего тега

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

Я могу легко получить значение значения атрибута name на основе значения режима, как показано ниже

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

Но если я хочу добавить еще условие, которое "получает значение атрибута имени, когда mode = X и атрибут инструмента не существует в теге приложения"

Как мы это делаем? Я попробовал что-то вроде

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

но не работает.

Я раньше не использовал XPath, и я нахожу это сложным. Я ищу помощь W3C на XPath, но не нашел того, что хотел. Пожалуйста, помогите.

Ответ 1

How do we do this? I tried something like 

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

but its not working.



[email protected]

является недопустимым синтаксисом в XPath. Существует оператор !=, но не оператор !.

Использование

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

Есть две вещи, которые вы всегда должны избегать:

  • с помощью оператора != - он имеет странное определение и не ведет себя как функция not() - никогда не использует его, если один из операндов является node -set.

  • Старайтесь избегать как можно большего использования с помощью сокращения // - это может вызвать сильную неэффективность, а также имеет аномальное поведение, которое не подходит большинству людей.

Ответ 2

Использование not(@tool) вместо [email protected] должно выполнить задание. Если ваш движок XPath не ведет себя, вы можете сделать count(@tool)=0, но это не обязательно.