2012-06-21 55 views
6

我想测试一个元素的祖先属性不等于一个字符串。Xpath测试的祖先属性不等于字符串

这里是我的XML ...

<aaa att="xyz"> 
<bbb> 
<ccc/> 
</bbb> 
</aaa> 
<aaa att="mno"> 
<bbb> 
<ccc/> 
</bbb> 
</aaa> 

如果我作用于元素CCC我,我想,以测试其祖父AAA @att不等于“XYZ”。

目前,我有这个...

ancestor::aaa[not(contains(@att, 'xyz'))] 

谢谢!

+0

*什么元素*的祖先?你的意思是一个至少有一个子元素的元素? –

+0

对不起,有问题的元素括号。在示例XML之后查看我的新行。 – Jeff

回答

15

假设说你指的是与子元素的元素的元素的祖先,这个XPath表达式应该做的:

//*[*/ccc][@att != 'xyz'] 

它选择

  1. 所有节点
  2. 至少有一个<ccc>孙子节点
  3. 并且有一个att属性的值不是xyz

更新:对祖父母<ccc>的限制测试。

更新2:适合您的修订问题:

//ccc[../parent::aaa/@att != 'xyz'] 

选择

  1. 所有<ccc>元素
  2. 有祖父母<aaa>其属性att设定为一个值不是xyz
+0

感谢您的回复。不过,我只想测试ccc的祖父母aaa。从你的解释来看,它会测试文档中的所有aaa节点。 – Jeff

+0

@Jeff:从你的问题来看,这并不是很清楚。我已经更新了我的回复。 –

+0

对不起,我更新了我原来的问题。 – Jeff