我有以下xml:
<?xml version="1.0" encoding="utf-8" ?>
<ROLES>
<ROLE type="A">
<USER name="w" />
<USER name="x" />
<ROLE type="B">
<USER name="x" />
<USER name="y" />
</ROLE>
<ROLE type="C">
<USER name="x" />
<USER name="y" />
<USER name="z" />
</ROLE>
</ROLE>
<ROLE type ="D">
<USER name="w" />
</ROLE>
</ROLES>
我希望找到所有带有name="x"
的USER节点,它们是ROLE节点的直接子节点,属性“type”等于“C”,它们的祖先带有name="x"
(可能是通过使用祖先 - 或者 - 自己的轴)。在这种情况下,节点集应该
包含两个节点(不是三个,因为在B下出现x应该是
不算数。)
什么是正确的XPath表达式?为什么以下表达式不起作用?
/ROLES//ROLE[@type='C']/USER[@name='x']/ancestor-or-self::USER[@name='x']
(这只返回一个节点,可能是自身轴,而不是祖先)
非常感谢任何帮助。
答案 0 :(得分:5)
我想找到名称=“x”...
的所有USER节点
//USER[@name = 'x']
...具有属性“type”的ROLE节点的直接子节点等于“C”...
//USER[@name = 'x' and parent::ROLE[@type = 'C']]
......和他们的祖先名字=“x”。
?
我没有看到任何可能有名称=“x”的祖先。你的意思是什么?
...和他们的祖先的孩子USER
s的名字=“x”
//USER[@name = 'x' and parent::ROLE[@type = 'C']]/ancestor::ROLE/USER[@name = 'x']
现在问题为什么你的XPath不起作用了:
/ROLES//ROLE[@type='C']/USER[@name='x']/ancestor-or-self::USER[@name='x']
选择
ROLE
(/ROLES
)后代的所有"/ROLES//ROLE"
... @type='C'
(“/ ROLES // ROLE [@ type ='C']”)... @name='x'
(/USER[@name='x']
)ancestor-or-self::USER
@name='x'
最后一个位置步骤打破了它。没有USER
祖先,只有ROLE
祖先。