Многоэлементные фильтры 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']/..
3 ответа
Это очень фундаментальная особенность XPath: составление ряда условий с помощью логических операторов and
, or
и функция not()
,
and
имеет более высокий приоритет, чем or
и оба оператора имеют более низкий приоритет, чем операторы отношения и равенства (=
, !=
, >
, >=
, <
а также <=
).
Таким образом, можно написать: A = B and C = D
Некоторые наиболее частые ошибки:
Люди пишут
AND
и / илиOR
, Помните, что XPath чувствителен к регистру.Люди используют
|
(объединение) оператор вместоor
Наконец, вот мое решение:
/ SavingAccounts / SavingAccount [ServiceOnLine = 'yes' или ServiceViaPhone='yes']
/SavingAccounts/SavingAccount[(ServiceOnLine='yes') or (ServiceViaPhone='yes')]
Будет
/SavingAccounts/SavingAccount[ServiceOnline/text()='yes' or ServiceViaPhone/text()='yes']
сделать трюк?
В данный момент у меня нет удобного оценщика XPath.
РЕДАКТИРОВАТЬ:
Если я правильно помню, вам не нужен текст (), поэтому
[ServiceOnline='yes' or ServiceViaPhone='yes']
должно быть достаточно и более читабельным.
РЕДАКТИРОВАТЬ:
Да, конечно, "или" для выражений предикатов, мой плохой.