Запрос 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
, но это не обязательно.