Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml xpath选择所有父级和所有子级_Xml_Xslt_Xpath - Fatal编程技术网

Xml xpath选择所有父级和所有子级

Xml xpath选择所有父级和所有子级,xml,xslt,xpath,Xml,Xslt,Xpath,我需要编写两个xpath查询,其中一个选择特定元素的所有父元素,从元素的直接父元素到根元素,然后我将能够选择元素的某些特定属性 另一个选择元素的所有子元素,无论它们位于何处 例如,如果xml文档类似于: <role key='total-admin'> <role key='security-admin'> <role key='users-admin'> <role key='add-user'>&

我需要编写两个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>
  • 我想选择“安全管理员”的所有子项。结果将是:

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

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

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

    //role[@key = 'security-admin']//*
    

    您始终有一个上下文节点,定义为具有特定属性值的元素,例如
    “添加用户”
    “安全管理”

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

    //*[@key = "string" and count(//*[@key = "string"]) = 1]
    
    这就解决了对上下文节点的需求。然后,您可以使用
    表示该contextnode,也可以逐字写入其中

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

    选择所有子对象(即子体轴):

    //*[@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]//*