Отримайте N-ту дочірню частину вузла за допомогою xpath


77

Мій зразок вхідного XML:

<root>
 <a>
   <b>item</b>
   <b>item1</b>
   <b>item2</b>
   <b>item3</b>
   <b>item4</b>
 </a>
</root>

Я припускаю вибрати вузол b, позиція якого є значенням змінної.

Як я можу використовувати значення змінної для тестування позиції вузла?

Відповіді:



57

Має працювати наступне:

/root/a/b[2]

А якщо ні, спробуйте:

/root/a/b[position()=2]

1
Я прийшов сюди, щоб виявити різницю між цими двома, не могли б ви пояснити, чим вони відрізняються?
Андре

11
position()відноситься до позиції в домі [2] відноситься до другого результату у списку результатів.
Беккі Коннінг

2
@Andre. При використанні всередині оператора for-eachциклу selectвони однакові. Коли position()використовується в самому циклі, він посилається на набір результатів. [n]Формат працює тільки як скорочення , так як це єдиний умовний всередині [ ]блоку, в іншому випадку position()повинен бути використаний, як і в //a[(@id="xx") and (position()=3)], який є «будь-п'ята ланка , яке має idхх».
Патанджалі

@ Патанджалі Це заплутано - посилання з позицією () 3 є 5-м посиланням? Мені здається, [2] можна використовувати замість: nth-of-type (2), тоді як [position () = 2] буде еквівалентом: nth-child (2) тоді? Думаю, нам потрібно кілька прикладів, щоб розмити туман.
bitoolean

@Patanjali Я думаю, я зрозумів, що частина цього слова є стенограмою, коли я її перевірила, і вона дає мені лише "item1", запускаючи \\*[2]та \\*[position()=2]проти XML запитання. Дякую!
bitoolean
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.