XPATH选择所有属性attr到特定元素元素之外

时间:2018-08-30 06:43:26

标签: xpath

我正在选择所有属性id,并且一切进展顺利,因此一天的需求发生了变化,现在我必须选择所有属性,除了一个!

给出以下示例:

<root> 
  <structs id="123"> 
    <struct> 
      <comp> 
        <data id="asd"/> 
      </comp> 
    </struct> 
  </structs> 
</root>

我想选择所有属性id,除了/root/structs/struct/comp/data的属性

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

我尝试了以下操作:

//@id[not(ancestor::struct)]有点用,但我想提供到祖先轴的完整xpath,

//@id[not(contains(name(), 'data'))]无效,因为名称选择器返回基础节点的名称,该节点是属性而不是其父元素

1 个答案:

答案 0 :(得分:1)

以下内容应该可以实现您所描述的内容:

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