xpath选择所有父母和所有孩子

时间:2013-03-06 05:23:40

标签: xml xpath

我需要编写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>
  1. 我想用键'add-user'选择元素的所有父元素。结果将是:

    [ 'users-admin' , 'security-admin' , 'total-admin' ]
    
  2. 我想选择'security-admin'的所有孩子。结果将是:

    [ 'users-admin' , 'add-user' , 'delete-user' , 'deactivate-user' ]
    

2 个答案:

答案 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]//*