我正在尝试编写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标签。
感谢您的帮助!
答案 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}}