Суммирующие значения 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)

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

Другие вопросы по тегам