XPath selecionando um nó com algum valor de atributo igual ao valor de atributo de algum outro nó [fechado]


87
<grand id="grand">
  <parent>
    <child age="18" id="#not-grand"/>
    <child age="20" id="#grand"/> <!-- This is what I want to locate -->
  </parent>
</grand>

Alguém pode me dizer como expressar para localizar o segundo filho?

Isso não funciona ...

"/grand/parent/child[@id=concat('#',/grand/@id)]/@age"

Obrigado.


Eu sinto Muito. A expressão está OK. Descobri que tenho alguns problemas em outra área, não na expressão em si.


3
Seu xpath funciona bem para mim.
dogbane

3
O mesmo para mim - apenas testei aqui e ele seleciona o segundo elemento filho.
Andreas Dolk

2
Certo ... A expressão está OK. Eu sinto Muito. Cometi alguns erros na expressão (prefixo de namespace) e no documento de instância. Obrigado.
Jin Kwon

Respostas:


95

Este XPath é específico para o snippet de código que você forneceu. Para selecionar <child>com id como #grandvocê pode escrever //child[@id='#grand'].

Para envelhecer //child[@id='#grand']/@age

Espero que isto ajude


1
Obrigado Vaman. Ajudou. Eu quis dizer referir a expressão ('/ grand / @ id') para uma avaliação de tempo, não o valor ('# grand') que deve ser avaliado primeiro.
Jin Kwon

e se meu XML tiver uma lista de seções com o atributo de nome, então como selecionar é como subDataSource? Exemplo: <section name="valuation"> <capital-value> some data </capital-value> <location> some data </location> </section> <section name="subject-property"> <address>72 Gordon Avenue</address> <postcode>HA7 3QS</postcode> <bedrooms>2</bedrooms> </section>
Sanjay Sahani

30

Eu acho que é isso que você quer:

/grand/parent/child[@id="#grand"]

2
Obrigado, MarcoS. Eu quis dizer referir a expressão ('/ grand / @ id') para uma avaliação de tempo, não o valor ('# grand') que deve ser avaliado primeiro.
Jin Kwon

2
@ jin-kwon: Entendo. Então, você é XPath está bem.
MarcoS
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.