Pergunta

Eu tenho a seguinte estrutura XML de exemplo:

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

O que eu preciso fazer é filtrar nós o 'SavingAccount' usando o XPath, onde o valor de 'ServiceOnline' é 'sim' ou o valor de 'ServiceViaPhone' é sim.

O XPath deve voltar-me duas linhas !! Eu posso filtrar nós 'SavingAccount' onde ambos os valores dos elementos são sim como o exemplo a seguir XPATH, mas o que eu quero fazer é um ou comparação valor do elemento ???

/SavingAccounts/SavingAccount/ServiceOnline[text()='yes']/../ServiceViaPhone[text()='yes']/..
Foi útil?

Solução

Esta é uma característica XPath muito fundamental: compor uma série de condições com os operadores lógicos and , or , ea função not() .

and tem uma prioridade maior do que or e os operadores têm prioridade menor do que o relacional e igualdade operadores (=, !=, >, >=, &lt; e &lt;=).

Assim, é seguro para escrever : A = B and C = D

Alguns erros mais frequentes feitas :

  1. gravar AND e / ou OR Pessoas. Lembre-se, XPath é sensível a maiúsculas .

  2. As pessoas usam a | (união) operador em vez de or

Por último, aqui está a minha solução :

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

Outras dicas

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

Will

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

fazer o truque?

Eu não tenho XPath avaliador calhar no momento.

EDIT:
Se bem me lembro, você não precisa o texto (), então

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

deve ser suficiente, e mais legível.

EDIT:
Sim, claro, 'ou' para expressões de predicado, meu mau.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top