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

后端 未结 6 1098
温柔的废话
温柔的废话 2020-12-04 08:15

I have the following document:


  abc
  ccc
  
ffffd
zz
相关标签:
6条回答
  • 2020-12-04 08:52
    //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

    0 讨论(0)
  • 2020-12-04 08:53

    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']
    
    0 讨论(0)
  • 2020-12-04 08:54

    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.

    0 讨论(0)
  • 2020-12-04 09:07

    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

    0 讨论(0)
  • 2020-12-04 09:09

    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.

    0 讨论(0)
  • 2020-12-04 09:14

    Not sure why everybody is querying for siblings, you can also check for <bb/>-elements matching the predicate from <a/>'s predicate:

    //a[bb/text() = "zz"]/cc/text()
    
    0 讨论(0)
提交回复
热议问题