Xml XPath查询如何基于两个属性获取一个属性的值

Xml XPath查询如何基于两个属性获取一个属性的值,xml,xpath,Xml,Xpath,我想从下面的标记中提取name属性值 <application comments="Do not erase this one" executable="run_CIET" icon="default" instances="1" mode="1" name="CIET" order="10" selection="1" tool="y" /> 但如果我想添加更多的条件,即“当mode=X且工具属性不在应用程序

我想从下面的标记中提取name属性值

<application
    comments="Do not erase this one"
    executable="run_CIET"
    icon="default"
    instances="1"
    mode="1"
    name="CIET"
    order="10"
    selection="1"
    tool="y"
/>
但如果我想添加更多的条件,即“当mode=X且工具属性不在应用程序标记中时获取name属性值”

我们如何做到这一点?我试过类似的东西

xpath Applications.xml '//applications/application[@mode='3' and !@tool]'/@name
但它不起作用

我以前没有使用过XPath,我发现这很棘手,我搜索了关于XPath的W3C帮助,但没有找到我想要的。请帮助。

使用
而不是(@tool)
而不是
@工具
应该可以完成这项工作。如果您的XPath引擎没有运行,您可以考虑执行
count(@tool)=0
,但这应该不是必需的

How do we do this? I tried something like 

    xpath Applications.xml '//applications/application[@mode='3' and !@tool]'/@name

but its not working.



!@tool
XPath中的语法无效。有一个
=运算符,但没有
操作员

使用

//applications/application[@mode='3' and not(@tool)]/@name 
有两件事你应该尽量避免:

  • 使用
    =
    运算符——它的定义很奇怪,行为与
    not()
    函数不同——如果其中一个操作数是节点集,则永远不要使用它

  • 尽量避免使用
    /
    缩写词——这可能会导致严重的效率低下,也会导致大多数人不喜欢的异常行为


  • 好问题,+1。请参阅我的答案,了解您问题的解释、简短完整的解决方案和一些建议。:)
    //applications/application[@mode='3' and not(@tool)]/@name