C# xpath选择具有给定祖先属性的所有叶节点

C# xpath选择具有给定祖先属性的所有叶节点,c#,xml,xpath,C#,Xml,Xpath,我有一批XML,其中每个标记都有一个属性isOptional。这类xml的一个例子是 <node1 isOptional="False"> <node2 isOptional="True"> <node22 isOptional="False"> <node3 isOptional="False">text4</node3> </node22> <

我有一批XML,其中每个标记都有一个属性isOptional。这类xml的一个例子是

<node1 isOptional="False">
    <node2 isOptional="True">
        <node22 isOptional="False">
            <node3 isOptional="False">text4</node3>
        </node22>
    </node2>
    <node4 isOptional="False">
        <node5 isOptional="False">
            <node6 isOptional="True">text3</node6>
            <node7 isOptional="False">
                <node8 isOptional="True">text2</node8>
                <node9 isOptional="False">text1</node9>
            </node7>
        </node5>
    </node4>
</node1>
实际上我需要这样的东西:

//*[not(*) and @isOptional="False" and count(ancestor::*[@isOptional = "True"] = 0)]

你能帮我找到正确的xpath吗?

像这样的xpath应该可以:

//*[not(child::*) and not(ancestor-or-self::*[@isOptional = 'True'])]

我想你忘了提一个额外的要求。你说的:

我需要编写xpath来选择所有没有与
@isOptional=“True”

将映射到以下XPath表达式:

//*[not(*) and not(ancestor::*[@isOptional = 'True'])]
^^^                                                           "all"
   ^^^^^^^                                                    "leaf nodes"
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        "no ancestor where
                                                              @isOptional equals 'True'"
这将产生(由
----
分隔的单个结果):

唯一的结果就是

<node9 isOptional="False">text1</node9>
text1
因为现在XPath表达式包含
祖先或self::
轴,其中包括上下文节点本身

<node6 isOptional="True">text3</node6>
-----------------------
<node8 isOptional="True">text2</node8>
-----------------------
<node9 isOptional="False">text1</node9>
//*[not(*) and not(ancestor-or-self::*[@isOptional = 'True'])]
<node9 isOptional="False">text1</node9>