C# XPath所有子代,即使嵌套,但不是父代的子代

C# XPath所有子代,即使嵌套,但不是父代的子代,c#,xpath,C#,Xpath,我正在尝试编写XPath来处理一些XML节点 下面是我的XML示例(用于元素名称和嵌套说明) 我基本上是在尝试取消所有控件标记的嵌套,并用“Controls”标记包装它们,所以我在C#中使用这个Xpath来重新格式化-但我不想将控件从嵌套表单中拉出来,我想将它们的控件标记分开包装 谢谢你的帮助 那么: /Forms/Form[@id='blah']/descendant::Control[blah] 这使用控件查找上的子体轴(默认为子体) 显然,替换废话——它们只是为了简洁;上面的重要内容是

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

下面是我的XML示例(用于元素名称和嵌套说明)

我基本上是在尝试取消所有控件标记的嵌套,并用“Controls”标记包装它们,所以我在C#中使用这个Xpath来重新格式化-但我不想将控件从嵌套表单中拉出来,我想将它们的控件标记分开包装

谢谢你的帮助

那么:

 /Forms/Form[@id='blah']/descendant::Control[blah]
这使用控件查找上的
子体
轴(默认为
子体


显然,替换
废话
——它们只是为了简洁;上面的重要内容是
后代::

这将是
控件
s,只有一个
表单
祖先:

//Control[count(ancestor::Form)=1]
编辑:更好

//Control[not(ancestor::Form[2])]
在XPath2.0中

//Control except //Form//Form//Control
或者在XPath1.0中

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

请提供一个完整的XML文档示例(尽可能小)和您的代码生成的实际正在计算的XPath表达式。还提供了所选元素的确切信息。我在示例中遗漏了一些内容,其他表单中有嵌套的“表单”。我希望所有控件都位于窗体下面,但一个控件都不在嵌套窗体下面。所以,如果窗体嵌套了窗体,我希望窗体下的所有控件,而不是嵌套窗体下的控件。@user53885-有了这些额外的控件,在常规代码中执行它可能会更容易。。。您可能可以在xpath中实现这一点,但这非常重要
//Control except //Form//Form//Control
//Control[not(ancestor::Form/ancestor::Form)]