У меня есть следующий документ
<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/>
-элементов, соответствующих предикату из предиката <a/>
:
//a[bb/text() = "zz"]/cc/text()
Вам нужна following-sibling
ось XPath
//a/bb[text()="zz"]/following-sibling::cc[1]/text()
Протестируйте Xpath здесь: http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625
В: Как выбрать node с помощью XPath, если sibling node имеет определенное значение? "
Потому что есть только "Оси XPath" для следующих братьев и предшествующих братьев и сестер. Вы можете использовать один из них, если позиция исправлена.
Но лучше:
Ищите cc, родительский имеет дочерний bb со значением 'zz':
//cc[../bb='zz']"
Во-первых, ваш пример не является корректным 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).
..: Выбирает родительский элемент текущего node.
[../bb = 'zz']: где значение элемента sibling 'bb' равно zz.