我需要编写2个xpath查询,其中一个选择从元素的直接父项到根的特定元素的所有父项,然后我将能够选择元素的某些特定属性。
,另一个选择元素的所有子元素,无论它们在何处。
例如,如果xml文档类似于:
<role key='total-admin'>
<role key='security-admin'>
<role key='users-admin'>
<role key='add-user'></role>
<role key='delete-user'></role>
<role key='deactivate-user'></role>
</role>
</role>
</role>
我想用键'add-user'选择元素的所有父元素。结果将是:
[ 'users-admin' , 'security-admin' , 'total-admin' ]
我想选择'security-admin'的所有孩子。结果将是:
[ 'users-admin' , 'add-user' , 'delete-user' , 'deactivate-user' ]
答案 0 :(得分:8)
对于第一个查询使用:
//role[@key = 'add-user']/ancestor::*
第二个:
//role[@key = 'security-admin']//*
答案 1 :(得分:3)
您始终有一个上下文节点,您将其定义为具有特定属性值的元素,例如"add-user"
或"security-admin"
:
//*[@key = "string"]
由于这为您提供了一个节点集,因此上下文节点的表达式需要排除这种类型的所有非单个元素:
//*[@key = "string" and count(//*[@key = "string"]) = 1]
这解决了上下文节点的需求。然后,您可以使用.
表示该contextnode,或者逐字地将其写入。
选择上下文元素(即祖先轴)的所有父母,祖父母,曾祖父母等:
./ancestor::*
//*[@key = "string" and count(//*[@key = "string"]) = 1]/ancestor::*
选择所有子项(即后代轴):
./descendant::*
.//*
//*[@key = "string" and count(//*[@key = "string"]) = 1]/descendant::*
//*[@key = "string" and count(//*[@key = "string"]) = 1]//*