Фильтры нескольких элементов 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. люди используют | (union) оператор вместо or

наконец, вот мой решение:

/SavingAccounts/SavingAccount
           [ServiceOnLine='yes' or ServiceViaPhone='yes']


/SavingAccounts/SavingAccount[(ServiceOnLine='yes') or (ServiceViaPhone='yes')]

будет

/SavingAccounts/SavingAccount[ServiceOnline/text()='yes' or ServiceViaPhone/text()='yes']

делать трюк?

на данный момент у меня нет оценщика XPath.

EDIT:
Если я правильно помню, вам не нужен текст (), поэтому

[ServiceOnline='yes' or ServiceViaPhone='yes']

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

EDIT:
Да, конечно, "или"для предикатных выражений, мой плохой.