Получить общий вес уникального продукта

Привет всем, мне нужна ваша помощь! Я работал над кодом, который будет получать общий вес каждого уникального идентификатора продукта, который принадлежит циклу второго уровня. Вот код, который я использую. Но результат, который я получаю, равен 110, что должно быть только 60. Заранее спасибо!

<xforms:bind calculate="sum(instance('Generated')/page1/table1/item[sublinesA[not(sublineA/prodid = preceding-sibling::sublinesA/sublineA/prodid)]]/sublinesA/sublineA[not(prodid = preceding-sibling::sublineA/prodid)]/weight)" nodeset"instance('Generated')/page1/table1/totalwgt"></xforms:bind>

    <item>
    <sublinesA>
         <sublineA>
             <prodid>AAA</prodid>
             <weight>10</weight>
         </sublineA>
         <sublineA>
             <prodid>AAA</prodid>
             <weight>10</weight>
         </sublineA>
         <sublineA>
            <prodid>BBB</prodid>
            <weight>20</weight>
         </sublineA>
    </sublinesA>
   </item>

   <item>
    <sublinesA>
         <sublineA>
             <prodid>BBB</prodid>
             <weight>20</weight>
         </sublineA>
         <sublineA>
             <prodid>BBB</prodid>
             <weight>20</weight>
         </sublineA>
         <sublineA>
             <prodid>CCC</prodid>
             <weight>30</weight>
         </sublineA>
   </sublinesA>
   </item>

    <item>
     <sublinesA>
         <sublineA>
             <prodid>CCC</prodid>
             <weight>30</weight>
         </sublineA>
     </sublinesA>
   </item>

1 ответ

Ваш calculate выражение выбирает каждый sublinesA / sublineA / weight элемент, чей родитель sublineA Элемент имеет идентификатор продукта, отличный от идентификатора предыдущего брата. Итак, первый BBB во-вторых item считается, как и CCC в третьем пункте.

Если вы намереваетесь суммировать вес по элементам, то вы ошибаетесь, ожидая сумму 60; Вы должны ожидать три суммы 30, 50, 30.

Если, с другой стороны, вы намереваетесь суммировать вес для всех элементов в данной таблице (и, учитывая, как расчеты связаны, я полагаю, вы), то [not(prodid = preceding-sibling::sublineA/prodid)] не правильный предикат.

Если есть только один table1 экземпляр в экземпляре, то вы можете просто заменить [not(prodid = preceding::sublineA/prodid)], Если их несколько, вам понадобится либо сделать очень умный XPath, либо, возможно, реструктурировать документ, чтобы было проще делать то, что вам нужно.

(Это не относится к вашему вопросу, но я попутно отмечаю, что вы проверяете предикат дважды; если я что-то не упустил, первый дважды вложенный предикат можно отбросить, не меняя смысла выражения. Если ваш движок XForms действительно не Я настаиваю на оптимизации, я ожидаю, что единственный эффект первого предиката - замедление.)

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