C# xpath选择具有给定祖先属性的所有叶节点
我有一批XML,其中每个标记都有一个属性isOptional。这类xml的一个例子是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> <
<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>