XPATH Elemento vários filtros

votos
22

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 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']/..
Publicado 23/01/2009 em 14:58
fonte usuário
Em outras línguas...                            


3 respostas

votos
4

Vai

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

Faça o truque?

Eu não tenho nenhum avaliador XPath 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.

Respondeu 23/01/2009 em 15:07
fonte usuário

votos
9
/SavingAccounts/SavingAccount[(ServiceOnLine='yes') or (ServiceViaPhone='yes')]
Respondeu 23/01/2009 em 15:07
fonte usuário

votos
52

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

andtem uma prioridade maior do que ore ambos os operadores têm prioridade mais baixa do que os relacionais e igualdade de operadores ( =, !=, >, >=, &lt;e &lt;=).

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

Alguns erros mais frequentes feitas :

  1. As pessoas escrevem ANDe / ou OR. Lembre-se, XPath é sensível a maiúsculas .

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

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

/ SavingAccounts / SavingAccount
           [ServiceOnLine = 'sim' ou ServiceViaPhone = 'sim']

Respondeu 23/01/2009 em 15:27
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more