XPath wybieranie węzła z pewną wartością atrybutu równa się wartości atrybutu innego węzła [zamknięte]

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

Czy ktoś może mi powiedzieć, jak wyrazić zgodę na zlokalizowanie drugiego dziecka?

To nie działa ...

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

Dziękuję Ci.


Przepraszam. Wyrażenie jest OK. Okazało się, że mam pewne problemy w innym obszarze, a nie samo wyrażenie.

Jin Kwon
źródło
3
Twój xpath działa dobrze dla mnie.
dogbane
3
To samo dotyczy mnie - właśnie przetestowałem to tutaj i wybiera drugi element potomny.
Andreas Dolk
2
Racja ... Wyrażenie jest OK. Przepraszam. Popełniłem kilka błędów w wyrażeniu (przedrostek przestrzeni nazw) i dokumencie instancji. Dziękuję Ci.
Jin Kwon

Odpowiedzi:

98

Ta ścieżka XPath jest specyficzna dla podanego fragmentu kodu. Aby wybrać <child>z identyfikatorem, jak #grandmożesz pisać //child[@id='#grand'].

Aby się zestarzeć //child[@id='#grand']/@age

Mam nadzieję że to pomoże

Vaman Kulkarni
źródło
1
Dziękuję Vaman. Pomogło. Miałem na myśli odwołanie się do wyrażenia („/ grand / @ id”) do jednorazowej oceny, a nie do wartości („# grand”), która powinna być oceniona jako pierwsza.
Jin Kwon
co się stanie, jeśli mój XML ma listę sekcji z atrybutem nazwy, to jak wybrać subDataSource? Przykład: <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

Myślę, że tego chcesz:

/grand/parent/child[@id="#grand"]
MarcoS
źródło
2
Dziękuję MarcoS. Miałem na myśli odwołanie się do wyrażenia („/ grand / @ id”) do jednorazowej oceny, a nie do wartości („# grand”), która powinna być oceniona jako pierwsza.
Jin Kwon
2
@ jin-kwon: Rozumiem. Więc jesteś XPath jest w porządku.
MarcoS