Элементы подсчета XSLT с заданным значением

Мне нужно подсчитать количество элементов в файле XML, которые имеют особое значение (для проверки уникальности). Файл XML выглядит следующим образом:

EDIT: Я обновил оригинальный "упрощенный" XML с фактической волосатые беспорядок кто-то разработан. К сожалению, это собирается сделать все предыдущие Ответы действительно запутанным и неправильным, если не редактировать.

<root>
  <ac>
   <Properties>
     <Property Name="Alive">
      <Properties>
        <Property Name="ID">
         <Properties>
           <Property Name="Value">
            <long>11007</long>
           </Property>
         </Properties>
        </Property>
      </Properties>
     </Property>
     <Property Name="Dead">
      <Properties>
        <Property Name="ID">
         <Properties>
           <Property Name="Value">
            <long>11008</long>
           </Property>
         </Properties>
        </Property>
      </Properties>
     </Property>
     ...
     <Property Name="MostlyDeadAllDay">
      <Properties>
        <Property Name="ID">
         <Properties>
           <Property Name="Value">
            <long>99001</long>
           </Property>
         </Properties>
        </Property>
      </Properties>
     </Property>
   </Properties>
  </ac>
</root>

Я пытаюсь определить переменную, чтобы увидеть, сколько свойств на уровне Alive/Dead имеют длинное значение (ID), как определено в параметре шаблона. Что-то в этом направлении (хотя я подозреваю, что это неправильно) ...

<xsl:param name="parPropId"/>
<xsl:variable name="countProperties">
   <xsl:value-of select="count(/root/ac/
      Properties/Property/
      Properties/Property[@Name = 'ID']/
      Properites/Property[@Name = 'Value']/long = $parPropId)"/>
</xsl:variable>

Может быть несколько элементов свойств, определенных на уровне "ID". Но я совершенно уверен, что могу рассчитывать только на один элемент свойства ("Значение") под "ID", и только один "длинный" элемент под "Значение".

(отказ) Тот, кто разработал общий файл XML, с которым я застрял, работая с REALLY, не знал, как структурировать XML (например, назад, использование атрибутов против элементов). Я боюсь, что мой XSLT мышления временно были деформированы :) в результате. (отказ)

Ответ на: "Элементы подсчета XSLT с заданным значением"

Количество ответов:3
<xsl:variable name="count" select="count(/Property/long = $parPropId)"/>

Не проверено, но я думаю, что должно работать. Я предполагаю, что узлы свойств являются прямыми детьми корневого узла и для того, чтобы вывезть ваш селектор потомка для peformance

Ваш xpath просто немного прочь:

count(//Property/long[text()=$parPropId])

Редактировать: Cerebrus совершенно справедливо указывает на то, что код в вашей ОП (с использованием неявной стоимости узла) абсолютно хорошо для ваших целей. В самом деле, так как это вполне вероятно, вы хотите работать с "Недвижимость" узел, а не "длинный" узел, это, вероятно, выше просить //Property[long=$parPropId] than the text() xpath, though you could make a case for the latter on readability grounds., чем текст () xpath, хотя вы могли бы сделать дело для последнего на основаниях читаемости.

Что я могу сказать, я немного устал сегодня :)

Этот XPath:

count(//Property[long = '11007'])

возвращает такое же значение, как:

count(//Property/long[text() = '11007'])

... за исключением того, что первый подсчитывает узлы Property nodes that match the criterion and the second counts , которые соответствуют критерию, а второй считает long child nodes that match the criterion. детские узлы, которые соответствуют критерию.

В соответствии с вашим комментарием и чтением вашего вопроса пару раз, я считаю, что вы хотите найти уникальность на основе сочетания критериев. Таким образом, в действительности, я думаю, что вы на самом деле проверки нескольких условий. Следующие будет работать также:

count(//Property[@Name = 'Alive'][long = '11007'])

, потому что это означает то же самое, что:

count(//Property[@Name = 'Alive' and long = '11007'])

Конечно, вы бы заменить значения для параметров в шаблоне. Вышеупомянутый код только иллюстрирует точку.

EDIT (после редактирования вопросов)


Вы были совершенно правы о XML быть ужасным. В самом деле, это прямо CodingHorror candidate! I had to keep recounting to keep track of the "Property" node I was on presently. I feel your pain! кандидата! Я должен был держать пересчета, чтобы отслеживать "Недвижимость" узел я был в настоящее время. Я чувствую твою боль!

Здесь вы идете:

count(/root/ac/Properties/Property[Properties/Property/Properties/Property/long = $parPropId])

Обратите внимание, что я удалил все другие проверки (для ID и значение). Они, как представляется, не требуется, так как вы можете прийти к соответствующему узлу, используя иерархию в XML. Также вы уже упомянули, что проверка на уникальность основана только на содержании элемента «-41-».