Значения суммирования XSLT на основе значений других узлов

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

Узел в Entry, относящийся к Item, всегда на 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>

person Davem    schedule 18.01.2014    source источник
comment
Что вы пробовали? Что не работает? Что должно вывести преобразование? Просьба уточнить.   -  person Carlo Cannas    schedule 18.01.2014
comment
Я обновил вопрос, указав желаемый результат и что-то, что я пробовал.   -  person Davem    schedule 18.01.2014
comment
Теперь гораздо лучше. Пожалуйста, взгляните на мой ответ.   -  person Carlo Cannas    schedule 18.01.2014


Ответы (1)


Вы должны решить с помощью этого выражения:

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

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

person Carlo Cannas    schedule 18.01.2014
comment
Я получаю это сейчас! спасибо за понимание. Это прекрасно работает. - person Davem; 20.01.2014