xpath:是否可以选择具有特定后代的祖先节点?

时间:2016-07-08 14:48:00

标签: xpath

首先,我需要一个带有某个后代a

的元素d
//a/b/c/d[@class='gotcha']

然后我想从a进行一些进一步的搜索,比如采取另一个后代:

//a/b/c/d[@class='gotcha']/../../../b2/c2/d2

是否有任何提升N级别的快捷方式?理想情况下,我想以某种方式选择" a,它有某些后代"供进一步使用。

UPD:示例xml

<a>
 <b>
  <c><d class='gotcha'></d></c>
 </b>
 <b2>
  <c2><d2></d2></c2>
 </b2>
</a>

我需要d2,知道结构和&#39;陷阱&#39;值可以改变。

1 个答案:

答案 0 :(得分:0)

我认为你所要求的是

a

那是:

  • 在任何地方找到元素b
    • 有一个c孩子的d孩子,其class='gotcha'孩子的属性为a
  • 现在,从目前为止选择的b2元素中,找到c2孩子的d2孩子的//a[b/c/d/@class='gotcha']/b2/c2/d2子元素。

注意:

  • XPath中的“child”一词意味着直接的孩子,而不是孙子或任何其他后代。上面的原始问题使用“孩子”来表示“后代”,这是误导和混淆。
  • XPath表达式将选择所有适用的节点。因此,上述解释中的所有单数名词都可以是复数。
  • 您也可以使用InsertForm.LayerList.Clear RC = 1 InsertForm.LayerType.Clear InsertForm.LayerList.Clear InsertForm.LayerType.AddItem "Schematic" InsertForm.LayerType.AddItem "Panel Layout" InsertForm.LayerType.AddItem "General Arrangement" Set RS = DB.GetConnection.Execute("select * from Layers where ProjectNUMBER = 'STANDARD' Order By LAYERName ASC") InsertForm.LayerList.AddItem "Name" InsertForm.LayerList.Column(1, 0) = "Color" InsertForm.LayerList.Column(2, 0) = "LineType" InsertForm.LayerList.Column(3, 0) = "LineWeight" While RS.EOF = False InsertForm.LayerList.AddItem Trim(RS.Fields.Item(2)) InsertForm.LayerList.Column(1, RC) = Trim(RS.Fields.Item(3)) InsertForm.LayerList.Column(2, RC) = Trim(RS.Fields.Item(4)) InsertForm.LayerList.Column(3, RC) = Trim(RS.Fields.Item(5)) RC = RC + 1 RS.MoveNext Wend InsertForm.MultiPage1.value = 0 InsertForm.MultiPage2.value = 0 InsertForm.Show End Sub ,这与上述内容相同,但我认为使用内部谓词可以更好地解释思维过程。