2011-04-12 88 views
1

我有一个类似的树的一个:使用节点选择祖父母选择它的后代

  tr 
     _|_ 
     td td 
     _| |_ 
    div  div 
    _|  |_ 
input  "foobar" 

我有节点“foobar的”选中的使用:

//*[normalize-space(text())='foobar'] 

但我我无法选择曾祖父母tr并选择了很大的孩子input有任何建议吗?

+0

好问题,+1。查看我的答案,了解可以使用的详尽XPath表达式集。 :) – 2011-04-13 04:35:19

+0

准确地说,我正在寻找。 +1。 – anujin 2013-10-11 08:09:00

回答

2

我有节点“foobar的”选中 使用:

//*[normalize-space(text())='foobar'] 

但我无法选择伟大的 祖父母tr和选择伟大的 孩子“foobar”与它。

我想你想要选择其字符串值(标准化后)为“foobar”的元素,从顶部元素tr开始。

这里是一个XPath表达式从顶部elemet tr“开始”,并选择想要的元素:

/tr//*[normalize-space()='foobar'] 

如果您需要选择文本节点本身(而不是其元素的父):

/tr//text()[normalize-space()='foobar'] 

如果你想避免//缩写的昂贵和缓慢的评价(因为你知道文档结构),用这句话:

/tr/td/div[normalize-space()='foobar'] 

甚至:

/tr/td[2]/div 

更新

现在OP改变了他的问题,并希望从已标准化的字符串值 'foobar' 命令的div选择input元素。

这里是一个XPath表达式恰好选择这个

../..//input 

../../td[1]/div/input 

请注意:如果这些表达式没有选择任何节点,它是最有可能该文档有一个默认的命名空间 - 搜索XPath默认命名空间 - 这个问题有很多很好的答案 - 在SO和互联网上。

+0

我其实在开头写错了。我有foobar文本节点,我想访问生活在同一个tr父母的输入。我编辑了我的问题上面。 – tipu 2011-04-13 15:52:43

+0

很好地解释了迪米特雷。它有帮助。 +1。 – anujin 2013-10-11 08:08:02

+0

@anujin,不客气。 – 2013-10-11 14:06:58

0

这个XPath表达式每选择一个元件具有空白正常化后后代文本节点等于 “foobar的”:

//*[.//text()[normalize-space()='foobar']]