7

我需要编写 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' ]
    
4

2 回答 2

10

对于第一个查询使用:

//role[@key = 'add-user']/ancestor::*

对于第二个:

//role[@key = 'security-admin']//*
于 2013-03-06T06:05:18.900 回答
3

您总是有一个上下文节点,您将其定义为具有特定属性值的元素,例如"add-user""security-admin"

//*[@key = "string"]

由于这为您提供了一个节点集,因此上下文节点的表达式需要排除这种类型的所有非单个元素:

//*[@key = "string" and count(//*[@key = "string"]) = 1]

这解决了您的上下文节点的需求。然后,您可以使用.或逐字写入该上下文节点。

选择上下文元素(即祖先轴)的所有父母、祖父母、祖父母等:

./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]//*
于 2013-03-06T07:08:41.437 回答