【问题标题】:Check for duplicate attribute values in xml nodes with XPath 1.0使用 XPath 1.0 检查 xml 节点中的重复属性值
【发布时间】:2020-02-07 14:12:31
【问题描述】:

大家下午好。 xpath查询遇到困难,请帮忙。 这是一个xml文件。

<Payload>
<row IncidentNumber= "PD1"></row>
<row IncidentNumber= "PD1"></row>
<row IncidentNumber= "PD1"</row>
</Payload>

我的目标是通过 xpath 查询检查任何行节点中是否存在重复的属性值。写了下面的 xpath 查询,但是没有用。出了什么问题?

boolean(//row/@IncidentNumber[not(. = ./following::row/@IncidentNumber and . = ../preceding::row/@IncidentNumber)])

提前致谢

【问题讨论】:

    标签: xml xpath duplicates


    【解决方案1】:

    这个 XPath 1.0 boolean expression:

    boolean(/Payload/row[@IncidentNumber=preceding-sibling::row/@IncidentNumber])
    

    有了这个输入:

    <Payload> 
      <row IncidentNumber="PD1"/>  
      <row IncidentNumber="PD1"/>  
      <row IncidentNumber="PD1"/> 
    </Payload>
    

    输出:

    true
    

    here中测试

    还有这个输入:

    <Payload> 
      <row IncidentNumber="PD1"/>  
      <row IncidentNumber="PD2"/>  
      <row IncidentNumber="PD3"/> 
    </Payload>
    

    输出:

    false
    

    here中测试

    编辑:正确的 XPath 1.0 不同/重复习语。读作:“是否有任何row@IncidentNumber 属性等于前面的任何一个?”

    注意:节点集比较是存在比较。来自规范:

    如果要比较的两个对象都是节点集,那么比较将 当且仅当在第一个节点集中有一个节点并且一个 第二个节点集中的节点,使得执行的结果 比较两个节点的字符串值是真的。

    【讨论】:

    • 将输入xml的属性修改如下 并使用您给出的布尔表达式,它给出了真正的输出,但它不正确。您能否建议正确的 xpath 表达式?
    【解决方案2】:

    这是正确的 XPath

    boolean(not(//row[@IncidentNumber = following::row/@IncidentNumber or @IncidentNumber = prior::row/@IncidentNumber ]))

    【讨论】:

      猜你喜欢
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多