【问题标题】:XPATH Select All Attributes attr Except One On Specific Element elemXPATH 选择所有属性 attr 除了一个特定元素 elem
【发布时间】:2018-08-30 06:43:25
【问题描述】:

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

举个例子:

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

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

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

我尝试了以下方法:

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

//@id[not(contains(name(), 'data'))] 它不起作用,因为名称选择器返回底层节点的名称,该名称是属性而不是其父元素

【问题讨论】:

    标签: xpath


    【解决方案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::*)])]
    

    【讨论】:

    • root 始终是 Xml 根元素 非常感谢您的回答!我会测试不同的案例,然后在这里报告
    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 2012-11-30
    • 2012-06-07
    • 2010-11-03
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多