XPath查询如何根据两个属性获取一个属性的值

时间:2010-10-06 09:18:58

标签: xml xpath

我想从以下标记中提取名称属性值

<application
    comments="Do not erase this one"
    executable="run_CIET"
    icon="default"
    instances="1"
    mode="1"
    name="CIET"
    order="10"
    selection="1"
    tool="y"
/>

我可以根据模式值轻松获取name属性值的值,如下所示

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

但是如果我想添加更多条件,那就是“当模式= X并且应用程序标签中没有工具属性时获取名称属性值”

我们怎么做?我试过像

这样的东西
xpath Applications.xml '//applications/application[@mode='3' and !@tool]'/@name

但它不起作用。

我之前没有使用XPath,我发现它很棘手我在XPath上搜索W3C帮助但是没找到我想要的东西。请帮忙。

2 个答案:

答案 0 :(得分:17)

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 

你应该总是尽量避免两件事:

  1. 使用!=运算符 - 它具有奇怪的定义,并且行为不像not()函数 - 如果其中一个操作数是节点集,则不使用它。 / p>

  2. 尽量避免使用//缩写 - 这可能会导致效率低下,并且还会出现大多数人无法接受的异常行为。

答案 1 :(得分:5)

使用not(@tool)代替!@tool可以完成这项工作。如果您的XPath引擎不正常,您可以想象count(@tool)=0,但这不是必需的。