简体   繁体   中英

How to select a node using XPath if sibling node has a specific value?

I have the following document:

<a>
  <bb>abc</bb>
  <cc>ccc</cc>
  <dd>ddd</dd>
</a>
<a>
  <bb>zz</bb>
  <cc>1</cc>
  <dd>2</dd>
</a>

How can I get the value of <cc> using XPath if <bb> is zz ?

不知道为什么每个人都在查询兄弟姐妹,您还可以检查与<a/>谓词中的谓词匹配的<bb/>元素:

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

What you need is following-sibling XPath axis

//a/bb[text()="zz"]/following-sibling::cc[1]/text()

Test the Xpath here: http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625

Q: How to select a node using XPath if sibling node has a specific value?
Because there are only "XPath Axes" for following-siblings and preceding-siblings, you can use one of them if the position is fixed.

But better: Look for cc were the parent has child bb with value 'zz' :

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

First off, your example is not well-formed XML. Overlooking that and that you didn't describe your intents very well (What exactly do you want to select on which condition?), I assume you want to do this:

//cc[preceding-sibling::bb[text()="zz"]]/text()

It selects

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"]

You could write is also as

//bb[text()="zz"]/following-sibling::cc/text()

Please look at the spec , it has some very well readable examples from which you'll learn a lot.

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

//a : Selects all 'a' elements no matter where it is.

//a/cc : Selects 'cc' elements that are children of the 'a' element (no matter where a is).

.. : Selects the parent of the current node.

[../bb='zz'] : where value of sibling 'bb' element is zz.

Reference: http://www.w3schools.com/xsl/xpath_syntax.asp

Another solution for this problem is

//bb[contains(.,'zz')]/../cc/text()

Explanation : Any bb that contains 'zz' string in all the child nodes of bb then going to parent node of that bb using .. , now that we can access the cc so returning text.

I hope that explanation isn't complex.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM