如果同级节点具有特定值,如何使用XPath选择节点?


87

我有以下文件:

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

<cc>如果<bb>是,如何获得使用XPath的价值zz


1
问题是我知道如何访问特定节点,但是如果同级具有特定值,我不知道如何访问节点。可能是这样的/ a / cc / contains(/ a / bb ='zz')吗?
HOE SENGKIANG 2013年

Answers:


97

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

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

23
“不确定为什么每个人都在查询兄弟姐妹”:也许因为问题是在为兄弟姐妹.. ;-)
hr_117 2013年

4
看来我实际上没有看过标题。:)答案仍然有效。
Jens Erat

2
您的答案也查询兄弟姐妹。您只是没有使用*-sibling轴。+1。
LarsH 2013年

这不能回答问题,但可以回答我提出的糟糕的实际问题。谢谢!
User9213

37

您需要的是following-siblingXPath轴

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

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


4
@HOESENGKIANG:您应该单击复选标记以“接受”此答案,或者您认为最能回答该问题的人。
LarsH 2013年

23

问:如果同级节点具有特定值,如何使用XPath选择节点?
因为只有“ XPath轴”用于后继兄弟和前继兄弟,所以如果位置固定,则可以使用其中之一。

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

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

6
要么//a[bb = 'zz']/cc
Tomalak 2013年

不知道您的意思是“仅用于同级和同级的XPath轴”。您是指所有兄弟姐妹都没有单一轴的事实吗?
LarsH 2013年

@LarsH:是的,对不起,(对不起我的英语:-()-那是我要说的。(因为问题是给兄弟姐妹的。)
hr_117 2013年

6

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

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


1
@LarsH感谢您从“无效”到“格式不正确”的更正。今天我学到了一些新东西。
PetrJaneček2013年

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


4

解决此问题的另一种方法是

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

说明:任何bb包含'zz'在所有子节点的字符串bb,然后去的父节点即bb使用..了,现在我们可以访问cc,从而返回文本。

我希望解释不复杂。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.