Подтвердить что ты не робот

Фильтры множественных элементов 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']/..
4b9b3361

Ответ 1

Это очень фундаментальная функция XPath: составление ряда условий с помощью логических операторов and, or, а функция not().

and имеет более высокий приоритет, чем or, и оба оператора имеют более низкий приоритет, чем реляционный и равенство (=, !=, >, >=, &lt; и &lt;=).

Таким образом, безопасно писать: 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:
Да, конечно, "или" для предикатных выражений, мой плохой.