繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM