[英]xpath to select all leaf nodes with given ancestors attribute
我有一批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>
我需要编写xpath来选择所有没有@isOptional="True"
叶节点。 对于此示例,结果应为:
<node9 isOptional="False">text1</node9>
其实我需要这样的东西:
//*[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'"
会产生(单个结果以------
分隔):
<node6 isOptional="True">text3</node6>
-----------------------
<node8 isOptional="True">text2</node8>
-----------------------
<node9 isOptional="False">text1</node9>
但是我假设您打算添加:此外,目标节点的isOptional
属性也不能设置为True
。 这将导致以下路径表达式,potame已经正确建议了该路径表达式:
//*[not(*) and not(ancestor-or-self::*[@isOptional = 'True'])]
唯一的结果是
<node9 isOptional="False">text1</node9>
因为现在XPath表达式包含ancestor-or-self::
轴,其中包括上下文节点本身。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.