Суммирующие значения XSLT на основе значений других узлов
Я пытаюсь суммировать некоторые значения XML в одном узле на основе значения в другом узле.
Узел в Entry
что относится к пункту всегда один RecordNo
меньше чем RecordNo
в Item
, Итак Entry
с RecordNo
1 относится к пункту с RecordNo
2.
Я хочу суммировать все узлы Item/Cost, где IsValid = 1
для соответствующего узла входа. Я могу использовать только XSLT версии 1.0.
я пытался
Sum(../Items/Item[../Entries/Entry[IsValid=1 and RecordNo -1 = ../Entries/Entry/RecordNo]])
Мой желаемый результат из приведенного ниже примера будет 22.
<Root>
<Items>
<Item>
<Cost>10</Cost>
<RecordNo>2</RecordNo>
<Type>1</Type>
</Item>
<Item>
<Cost>12</Cost>
<RecordNo>5</RecordNo>
<Type>1</Type>
</Item>
<Item>
<Cost>10</Cost>
<RecordNo>9</RecordNo>
<Type>2</Type>
</Item>
</Items>
<Entries>
<Entry>
<IsValid>1</IsValid>
<RecordNo>1</RecordNo>
</Entry>
<Entry>
<IsValid>1</IsValid>
<RecordNo>4</RecordNo>
</Entry>
<Entry>
<IsValid>0</IsValid>
<RecordNo>8</RecordNo>
</Entry>
</Entries>
</Root>
1 ответ
Решение
Вы должны решить с этим выражением:
sum(/Root/Items/Item[RecordNo -1=/Root/Entries/Entry[IsValid=1]/RecordNo]/Cost)
Проблема с вашим заключается в том, что вы путаетесь с узлом контекста, помните, что любое относительное выражение пути в предикате (выражение, которое вы заключаете в скобки) относится к текущему элементу, который будет выбран в случае, если выражение вычисляет к истине.