Проверьте наличие повторяющихся значений атрибутов в узлах xml с XPath 1.0 - PullRequest
0 голосов
/ 07 февраля 2020

Добрый день всем. Обнаружены трудности с запросом 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)])

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Вот правильный XPath

логический (не (// row [@IncidentNumber = follow :: row / @ IncidentNumber или @IncidentNumber = предыдущий :: row / @ IncidentNumber]))

0 голосов
/ 07 февраля 2020

Это 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 равен любому предшествующему?"

Примечание : сравнение наборов узлов является экзистенциальным сравнением , Из спецификации c:

Если оба сравниваемых объекта являются наборами узлов, то сравнение будет истинным, если и только если в первом наборе узлов есть узел и узел во втором наборе узлов, так что результат выполнения сравнения строковых значений двух узлов равен true.

...