Фильтры множественных элементов XPATH
У меня есть следующая XML-структура:
<SavingAccounts>
<SavingAccount>
<ServiceOnline>yes</ServiceOnline>
<ServiceViaPhone>no</ServiceViaPhone>
</SavingAccount>
<SavingAccount>
<ServiceOnline>no</ServiceOnline>
<ServiceViaPhone>yes</ServiceViaPhone>
</SavingAccount>
</SavingAccounts>
Что мне нужно сделать, это отфильтровать узлы "SavingAccount" с помощью XPATH, где значение "ServiceOnline" равно "да" или значение "ServiceViaPhone" да.
XPATH должен вернуть мне две строки!! Я могу отфильтровать узлы SavingAccount, где оба значения элемента да, например, следующий образец XPATH, но то, что я хочу сделать, это сравнение значений элементов или элементов.
/SavingAccounts/SavingAccount/ServiceOnline[text()='yes']/../ServiceViaPhone[text()='yes']/..
Ответы
Ответ 1
Это очень фундаментальная функция XPath: составление ряда условий с помощью логических операторов and
, or
, а функция not()
.
and
имеет более высокий приоритет, чем or
, и оба оператора имеют более низкий приоритет, чем реляционный и равенство (=
, !=
, >
, >=
, <
и <=
).
Таким образом, безопасно писать: A = B and C = D
Некоторые наиболее часто совершаемые ошибки:
-
Люди пишут and
и/или or
. Помните, что XPath чувствителен к регистру.
-
Люди используют оператор |
(union) вместо or
Наконец, вот мое решение:
/SavingAccounts/SavingAccount
[ServiceOnLine='yes' or ServiceViaPhone='yes']
Ответ 2
/SavingAccounts/SavingAccount[(ServiceOnLine='yes') or (ServiceViaPhone='yes')]
Ответ 3
Воля
/SavingAccounts/SavingAccount[ServiceOnline/text()='yes' or ServiceViaPhone/text()='yes']
сделать трюк?
У меня нет оценщика XPath, доступного на данный момент.
EDIT:
Если я правильно помню, вам не нужен текст(), поэтому
[ServiceOnline='yes' or ServiceViaPhone='yes']
должно быть достаточным и более читаемым.
EDIT:
Да, конечно, "или" для предикатных выражений, мой плохой.