Этот XPath:
count(//Property[long = '11007'])
возвращает то же значение, что и:
count(//Property/long[text() = '11007'])
... за исключением того, что первый насчитывает Property
узлов, которые соответствуют критерию, а второй - long
дочерних узлов, которые соответствуют критерию.
Что касается вашего комментария и чтения вашего вопроса пару раз, я считаю, что вы хотите найти уникальность на основе комбинации критериев. Поэтому, на самом деле, я думаю, что вы на самом деле проверяете несколько условий. Следующее будет работать также:
count(//Property[@Name = 'Alive'][long = '11007'])
потому что это означает то же самое, что и:
count(//Property[@Name = 'Alive' and long = '11007'])
Конечно, вы должны подставить значения параметров в ваш шаблон. Приведенный выше код только иллюстрирует точку.
РЕДАКТИРОВАТЬ (после редактирования вопроса)
Вы были совершенно правы в том, что XML ужасен. На самом деле, это прямой CodingHorror кандидат! Мне пришлось продолжать пересчет, чтобы отслеживать узел «Свойство», на котором я был в настоящее время. Я чувствую твою боль!
Вот, пожалуйста:
count(/root/ac/Properties/Property[Properties/Property/Properties/Property/long = $parPropId])
Обратите внимание, что я удалил все другие проверки (для идентификатора и значения). Похоже, они не обязательны, поскольку вы можете добраться до соответствующего узла, используя иерархию в XML. Кроме того, вы уже упоминали, что проверка уникальности основана только на содержимом элемента long
.