У мене є такий документ:
<a>
<bb>abc</bb>
<cc>ccc</cc>
<dd>ddd</dd>
</a>
<a>
<bb>zz</bb>
<cc>1</cc>
<dd>2</dd>
</a>
Як я можу отримати значення <cc>
використання XPath, якщо воно <bb>
є zz
?
У мене є такий документ:
<a>
<bb>abc</bb>
<cc>ccc</cc>
<dd>ddd</dd>
</a>
<a>
<bb>zz</bb>
<cc>1</cc>
<dd>2</dd>
</a>
Як я можу отримати значення <cc>
використання XPath, якщо воно <bb>
є zz
?
Відповіді:
Не впевнені, чому всі запитують братів і сестер, ви також можете перевірити наявність <bb/>
-elements, що відповідають предикату з предиката <a/>
'
//a[bb/text() = "zz"]/cc/text()
*-sibling
вісь. +1, однак.
Вам потрібна following-sibling
вісь XPath
//a/bb[text()="zz"]/following-sibling::cc[1]/text()
Перевірте Xpath тут: http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625
З: Як вибрати вузол за допомогою XPath, якщо вузол брата або сестри має певне значення?
Оскільки для наступних братів та сестер є лише "XPath Axes", ви можете використовувати одну з них, якщо позиція фіксована.
Але краще:
шукайте, чи cc
є у батька дитина bb
з вартістю 'zz'
:
//cc[../bb='zz']
//a[bb = 'zz']/cc
.
По-перше, ваш приклад - це неправильно сформований XML. Зважаючи на те, і що ви не дуже добре описали свої наміри (Що саме ви хочете вибрати, за якої умови?), Я припускаю, що ви хочете зробити це:
//cc[preceding-sibling::bb[text()="zz"]]/text()
Це відбирає
TEXT VALUES OF ALL <CC> ELEMENTS
//cc /text()
THAT HAVE A PRECEDING SIBLING <BB>
[preceding-sibling::bb ]
THAT HAS TEXT VALUE EQUAL TO "zz"
[text()="zz"]
Ви могли б написати також як
//bb[text()="zz"]/following-sibling::cc/text()
Будь ласка, подивіться на специфікацію , у ній є кілька добре читабельних прикладів, з яких ви дізнаєтесь багато нового.
//a/cc[../bb='zz']/text()
// a: Вибирає всі елементи 'a' незалежно від того, де вони знаходяться.
// a / cc: Вибирає елементи "cc", які є дочірніми елементами "a" (незалежно від того, де a).
..: Вибирає батьківський елемент поточного вузла.
[../bb='zz ']: де значення елемента "bb" брата або сестри дорівнює zz.
Іншим рішенням цієї проблеми є
//bb[contains(.,'zz')]/../cc/text()
Пояснення : Будь-який, bb
що містить 'zz'
рядок у всіх дочірніх вузлах, bb
а потім переходить до батьківського вузла цього bb
використання ..
, тепер ми можемо отримати доступ до cc
тексту, що повертається.
Я сподіваюся, що пояснення не є складним.