Подтвердить что ты не робот

Как выбрать node с помощью XPath, если sibling node имеет определенное значение?

У меня есть следующий документ

<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?

4b9b3361

Ответ 1

Не уверен, почему все запрашивают братьев и сестер, вы также можете проверить наличие <bb/> -элементов, соответствующих предикату из предиката <a/>:

//a[bb/text() = "zz"]/cc/text()

Ответ 3

В: Как выбрать node с помощью XPath, если sibling node имеет определенное значение? "
Потому что есть только "Оси XPath" для следующих братьев и предшествующих братьев и сестер. Вы можете использовать один из них, если позиция исправлена.
Но лучше:
Ищите cc, родительский имеет дочерний bb со значением 'zz':

//cc[../bb='zz']"

Ответ 4

Во-первых, ваш пример не является корректным 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()

Пожалуйста, посмотрите спецификацию, у него есть очень хорошо читаемые примеры, из которого вы узнаете много.

Ответ 5

//a/cc[../bb='zz']/text()

//a: выбирает все элементы 'a' независимо от того, где он находится.

//a/cc: выбирает элементы 'cc', которые являются дочерними элементами элемента 'a' (независимо от того, где a).

..: Выбирает родительский элемент текущего node.

[../bb = 'zz']: где значение элемента sibling 'bb' равно zz.

Ссылка: http://www.w3schools.com/xsl/xpath_syntax.asp