XPath выбирает узел с некоторым значением атрибута, равным значению атрибута другого узла [закрыто]

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>

Кто-нибудь может сказать мне, как выразить местонахождение второго ребенка?

Это не работает ...

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

Спасибо.


Мне жаль. Выражение ОК. Я обнаружил, что у меня проблемы в другой области, а не в самом выражении.

Джин Квон
источник
3
Ваш xpath у меня отлично работает.
Dogbane
3
То же самое для меня - просто протестировал его здесь, и он выбирает второй дочерний элемент.
Андреас Долк
2
Правильно ... Выражение ОК. Мне жаль. Я сделал несколько ошибок в выражении (префикс пространства имен) и в документе экземпляра. Спасибо.
Джин Квон

Ответы:

95

Этот XPath специфичен для предоставленного вами фрагмента кода. Выбирать <child>с id как #grandможно писать //child[@id='#grand'].

Чтобы получить возраст //child[@id='#grand']/@age

Надеюсь это поможет

Ваман Кулькарни
источник
1
Спасибо Ваман. Это помогло. Я имел в виду ссылку на выражение ('/ grand / @ id') для однократной оценки, а не на значение ('# grand'), которое следует оценить в первую очередь.
Джин Квон
что, если в моем XML есть список разделов с атрибутом имени, тогда как выбрать его как subDataSource? Пример: <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>
Санджай Сахани
30

Думаю, это то, что вам нужно:

/grand/parent/child[@id="#grand"]
MarcoS
источник
2
Спасибо, MarcoS. Я имел в виду ссылку на выражение ('/ grand / @ id') для однократной оценки, а не на значение ('# grand'), которое следует оценить в первую очередь.
Джин Квон
2
@ jin-kwon: Понятно. Итак, у вас XPath в порядке.
MarcoS