以下示例说明了我的问题:
<nodes>
<node at1="1" at2="2"> 12 </node>
<node at1="1" at2="2" at3="3"> 123 </node>
<node at1="1"> 1 </node> <-----find this node
</nodes>
/nodes/node[@at1]
返回所有三个节点,但我正在寻找只有“at1”属性而没有其他属性的节点。
这发现node
有属性@at1
,没有其他属性:
//node[@at1 and count(@*) = 1]
如果你想允许另一个可选属性x
,你可以这样做:
//node[@at1 and count(@*) - count(@x) = 1]
如果你有xmlns
这样的命名空间声明的节点怎么办:
<nodes>
<node at1="1"> 1 </node>
<node at1="2" xmlns="http://xyz"> 2 </node>
</nodes>
您可以像这样匹配两个节点:
//*[name()='node' and @at1 and count(@*) = 1]
仅匹配具有 的节点xmlns
:
//*[name()='node' and @at1 and count(@*) = 1 and namespace-uri()='http://xyz']
只匹配没有的节点xmlns
:
//*[name()='node' and @at1 and count(@*) = 1 and namespace-uri()='']