У меня есть следующий документ:
<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()
*-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» для следующих и предшествующих братьев и сестер, вы можете использовать одну из них, если положение фиксировано.
Но лучше:
посмотрите, есть ли 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
так возвращаемому тексту.
Надеюсь, это объяснение несложно.