99

我有以下文件:

<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

4

6 回答 6

115

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

//a[bb/text() = "zz"]/cc/text()
于 2013-06-11T10:47:28.340 回答
45

您需要的是following-siblingXPath 轴

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

在此处测试 Xpath:http ://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625

于 2013-06-11T09:14:32.420 回答
28

问:如果兄弟节点具有特定值,如何使用 XPath 选择节点?
因为following-siblings和previous-siblings只有“XPath Axes”,如果位置固定,您可以使用其中之一。

但更好: 寻找cc父母是否bb有价值的孩子'zz'

//cc[../bb='zz']
于 2013-06-11T09:17:15.790 回答
10

首先,您的示例不是格式良好的 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()

请查看规范,它有一些非常易读的示例,您将从中学到很多东西。

于 2013-06-11T09:14:42.107 回答
6

这个问题的另一个解决方案是

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

解释:任何bb包含'zz'字符串的所有子节点,bb然后转到该bb使用的父节点..,现在我们可以访问cc返回的文本。

我希望解释并不复杂。

于 2019-03-14T22:21:20.863 回答
4
//a/cc[../bb='zz']/text()

//a : 选择所有 'a' 元素,无论它在哪里。

//a/cc : 选择作为 'a' 元素的子元素的 'cc' 元素(无论 a 在哪里)。

.. :选择当前节点的父节点。

[../bb='zz'] : 其中兄弟 'bb' 元素的值为 zz。

参考:http ://www.w3schools.com/xsl/xpath_syntax.asp

于 2015-08-19T17:06:20.710 回答