【问题标题】:xpath to select all leaf nodes with given ancestors attributexpath 选择具有给定祖先属性的所有叶节点
【发布时间】:2015-03-12 14:56:15
【问题描述】:

我有一批 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 吗?

【问题讨论】:

    标签: c# xml xpath


    【解决方案1】:

    这样的 XPath 应该可以工作:

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

    【讨论】:

      【解决方案2】:

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

      我需要编写 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:: 轴,其中包括上下文节点本身。

      【讨论】:

        猜你喜欢
        • 2011-01-30
        • 1970-01-01
        • 2013-04-26
        • 1970-01-01
        • 1970-01-01
        • 2013-11-30
        • 2012-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多