首页 > 解决方案 > 使用 XPath 1.0 检查 xml 节点中的重复属性值

问题描述

大家下午好。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)])

提前致谢

标签: xmlxpathduplicates

解决方案


这个 XPath 1.0布尔表达式

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

使用此输入:

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

输出:

true

这里测试

这与此输入:

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

输出:

false

这里测试

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

请注意:节点集比较是存在比较。从规范:

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


推荐阅读