2014-01-18 1 views
1

Я пытаюсь суммировать некоторые значения XML в одном узле на основе значения в другом узле.Значения суммирования XSLT, основанные на других значениях узлов

Узел в Entry, что относится к пункту всегда один RecordNo меньше RecordNo в Item. Так Entry с RecordNo 1 относятся к пункту с RecordNo 2.

Я хочу суммировать все Элемент/узлы затрат, где 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> 
+0

Что вы пробовали? Что не работает? Что должно сделать преобразование? Просьба уточнить. –

+1

Я обновил вопрос с помощью моего желаемого результата и что-то, что я пробовал – Davem

+0

Намного лучше. Пожалуйста, взгляните на мой ответ. –

ответ

1

Вы должны решить с этим выражением:

sum(/Root/Items/Item[RecordNo -1=/Root/Entries/Entry[IsValid=1]/RecordNo]/Cost) 

Проблема с вашими заключается в том, что вы запутались с узлом контекста, помните, что любое выражение относительного пути в предикат (выражение, которое вы помещаете между скобками) относится к текущему элементу, который будет выбран в случае, если выражение оценивается как true.

+0

Я понял! спасибо за понимание. Это отлично работает. – Davem