我正在选择所有属性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'))]
无效,因为名称选择器返回基础节点的名称,该节点是属性而不是其父元素
答案 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::*)])]