0

大家好,我需要你的帮助!我一直在编写一个代码,该代码将获取属于第二级循环的每个唯一产品 ID 的总权重。这是我正在使用的代码。但我得到的输出是 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>
4

1 回答 1

0

您的calculate表达式选择sublinesA / sublineA / weight其父sublineA元素的产品 ID 与其前一个兄弟元素不同的每个元素。因此,第二项BBB中的第一项item被计算在内,CCC第三项中的第一项也是如此。

如果您打算按项目计算重量,那么期望总和为 60 是错误的;您应该期待三个总和 30、50、30。

另一方面,如果您打算对给定表中所有项目的权重求和(并且考虑到计算的绑定方式,我猜您是这样),那么[not(prodid = preceding-sibling::sublineA/prodid)]这不是正确的谓词。

如果实例中只有一个table1实例,则只需替换[not(prodid = preceding::sublineA/prodid)]. 如果不止一个,您将需要做一些非常聪明的 XPath,或者可能重新构建文档以使其更容易做您需要的事情。

(这与您的问题无关,但我顺便指出您正在检查谓词两次;除非我遗漏了什么,否则可以删除第一个双重嵌套谓词而不改变表达式的含义。除非您的 XForms 引擎真的积极优化优化,我预计第一个谓词的唯一效果是减慢速度。)

于 2012-08-20T02:02:13.240 回答