代码之家  ›  专栏  ›  技术社区  ›  developer

XPath—选择等于值的元素

  •  87
  • developer  · 技术社区  · 14 年前

    XML数据示例:

    <aaa id="11" >
        <aaa id="21" >
            <aaa id="31" ></aaa>
            <bbb id="32" >
                <aaa id="41" ></aaa>
                <bbb id="42" ></bbb>
                <ccc id="43" ></ccc>
                <ddd id="44" >qwerty</ddd>
                <ddd id="45" ></ddd>
                <ddd id="46" ></ddd>
            </bbb>
        </aaa>
        <bbb id="22" >
             <aaa id="33" >qwerty</aaa>
             <bbb id="34" ></bbb>
             <ccc id="35" ></ccc>
             <ddd id="36" ></ddd>
             <ddd id="37" ></ddd>
             <ddd id="38" ></ddd>
        </bbb>
        <ccc id="23" >qwerty</ccc>
        <ccc id="24" ></ccc>
     </aaa>
    

    现在,使用XPath:

    //ccc[.='qwerty']
    

    我得到了正确的答案, 结果:

    Name    Value
    ccc     qwerty
    

    现在,使用XPath:

    //aaa[.='qwerty']
    

    我明白了

    Name    Value
    aaa      
    aaa     qwerty
    

    我特别感兴趣的是如何选择 任何 具有该值的元素

    XPath:

    //*[.='qwerty']
    

    我很奇怪 想不到的

    Name    Value
    aaa
    bbb
    ddd     qwerty
    bbb     qwerty
    aaa     qwerty
    ccc     qwerty
    

    有人能解释这些结果吗,以及如何修复XPath表达式以获得更多预期的结果?

    2 回复  |  直到 9 年前
        1
  •  191
  •   Dimitre Novatchev    14 年前

    XPath规范定义了 元素的所有文本节点子代的串联(按文档顺序)

    这就解释了“奇怪的结果”。

    //*[text() = 'qwerty']
    

    //*[text() = 'qwerty' and not(text()[2])]
    

    上面选择文档中只有一个子文本节点的每个元素,其值为:“qwerty”。

        2
  •  16
  •   Gregoire    14 年前

    尝试

    //*[text()='qwerty'] . 现在的 要素