Многоэлементные фильтры XPATH - PullRequest
21 голосов
/ 23 января 2009

У меня есть следующий пример структуры XML:

<SavingAccounts>
    <SavingAccount>
       <ServiceOnline>yes</ServiceOnline>
       <ServiceViaPhone>no</ServiceViaPhone>
    </SavingAccount>
    <SavingAccount>
       <ServiceOnline>no</ServiceOnline>
       <ServiceViaPhone>yes</ServiceViaPhone>
    </SavingAccount>
</SavingAccounts>

Что мне нужно сделать, так это отфильтровать узлы 'SavingAccount', используя XPATH, где значение 'ServiceOnline' равно 'yes' или значение 'ServiceViaPhone' равно yes.

XPATH должен вернуть мне две строки !! Я могу отфильтровать узлы 'SavingAccount', в которых оба значения элемента равны yes, как в следующем примере XPATH, но я хочу сделать сравнение значений или элементов ???

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

Ответы [ 3 ]

54 голосов
/ 23 января 2009

Это очень фундаментальная функция 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']

10 голосов
/ 23 января 2009
/SavingAccounts/SavingAccount[(ServiceOnLine='yes') or (ServiceViaPhone='yes')]
4 голосов
/ 23 января 2009

Будет

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

сделать трюк?

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...