Многоэлементные фильтры 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 и оба оператора имеют более низкий приоритет, чем операторы отношения и равенства (=, !=, >, >=, &lt; а также &lt;=).

Таким образом, можно написать: A = B and C = D

Некоторые наиболее частые ошибки:

  1. Люди пишут AND и / или OR, Помните, что XPath чувствителен к регистру.

  2. Люди используют | (объединение) оператор вместо 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']

должно быть достаточно и более читабельным.

РЕДАКТИРОВАТЬ:
Да, конечно, "или" для выражений предикатов, мой плохой.

Другие вопросы по тегам