XPath选择所有父节点和所有子节点

7

我需要编写两个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. I want to select all parents of the element with key 'add-user' .the result would be:

    [ 'users-admin' , 'security-admin' , 'total-admin' ]
    
  2. I want to select all children of 'security-admin'. the result would be:

    [ 'users-admin' , 'add-user' , 'delete-user' , 'deactivate-user' ]
    
2个回答

10

对于第一个查询,请使用:

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

对于第二个:
//role[@key = 'security-admin']//*

3

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

//*[@key = "string"]

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

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

这样可以满足您对上下文节点的需求。然后,您可以用 . 来表示上下文节点或直接将其抄写进去。

选择所有父级、祖父级、曾祖父级以及上下文元素的其他祖先(即ancestor轴):

./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]//*

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接