XPath所有后代,即使是嵌套 - 但不是父级的后代

时间:2011-04-28 12:47:05

标签: c# xpath

我正在尝试编写XPath来处理一些XML节点。

我的XML样本如下(元素名称和嵌套图示)。

<Forms> 
<Form> 
 <Control/> 
 <Control>   
    <Control></Control> 
 </Control> 
 <Control>
   <Form><!-- This is the nested one, I don't want the Control children from this-->
    <Control/>
   </Form>
 </Control>
</Form>

有没有办法修改下面的XPath语句 - 包括所有控件(甚至是嵌套在“Form”中的控件,但不包括嵌套Form中的控件(参见Form&lt; 2&gt;)?这个当前的XPath带回来了“控制“嵌套”表单“节点下面的内容。

string xpath = @"/Forms/Form[@id='" + node.Attributes["id"].Value + "']//Control[@type='GroupItem' or @type='Detail' or @type='GroupHeader']"; 

我基本上试图取消嵌套所有Control标签,并用“Controls”标签包装它们,所以我在C#中使用这个Xpath重新格式化 - 但我不想将Control从嵌套表单中拉出来,我想单独包装他们的Controls标签。

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

在XPath 2.0中

//Control except //Form//Form//Control

或在XPath 1.0中

//Control[not(ancestor::Form/ancestor::Form)]

答案 1 :(得分:1)

怎么样:

 /Forms/Form[@id='blah']/descendant::Control[blah]

这在Control查找中使用descendant轴(默认为child

显然取代blah - 它们只是为了简洁;上面重要的是descendant::

答案 2 :(得分:1)

只有一个Control祖先Form只有//Control[count(ancestor::Form)=1]

//Control[not(ancestor::Form[2])]

修改:更好

{{1}}