Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
XPATH选择除特定元素元素上的一个属性之外的所有属性attr_Xpath - Fatal编程技术网

XPATH选择除特定元素元素上的一个属性之外的所有属性attr

XPATH选择除特定元素元素上的一个属性之外的所有属性attr,xpath,Xpath,我选择了所有属性id,一切都进行得很顺利,然后有一天需求发生了变化,现在我必须选择除一个之外的所有属性 给出以下示例: <root> <structs id="123"> <struct> <comp> <data id="asd"/> </comp> </struct> </structs> </root>

我选择了所有属性id,一切都进行得很顺利,然后有一天需求发生了变化,现在我必须选择除一个之外的所有属性

给出以下示例:

<root> 
  <structs id="123"> 
    <struct> 
      <comp> 
        <data id="asd"/> 
      </comp> 
    </struct> 
  </structs> 
</root>
我想选择除/root/structs/struct/comp/data之外的所有属性id

请注意,Xml可能不同。 这意味着,我真正想要的是:给定任何Xml树,我想要选择除元素/root/structs/struct/comp/data上的属性id之外的所有属性id

我尝试了以下方法:

//@id[notancestor::struct]它有点工作,但我想提供一个到祖先轴的完整xpath,但我做不到


//@id[notcontainsname,'data']它不起作用,因为名称选择器返回基础节点的名称,该节点是属性而不是其父元素。

以下内容应符合您的描述:

//@id[not(parent::data/parent::comp/parent::struct/parent::structs/parent::root)]
如您所见,它只是从下到上检查id属性的父级是否与路径root/structs/struct/comp/data匹配

我认为这应该足以满足您的需要,但它不能100%确保父级位于路径/root/structs/struct/comp/data,因为它可能位于路径/someOtherHigherRoot/root/structs/struct/comp/data。我猜在您的XML结构中不可能出现这种情况,但如果必须检查这种情况,您可以这样做:

//@id[not(parent::data/parent::comp/parent::struct/parent::structs/parent::root[not(parent::*)])]
根始终是根Xml元素,非常感谢您的回答!我将测试不同的案例,然后在这里报告