Обобщена таблица с xForms

Имам xml като следния:

<table1>
    <row>
        <person>person1</person>
        <value>10</value>
    </row>
    <row>
        <person>person2</person>
        <value>20</value>
    </row>
    <row>
        <person>person1</person>
        <value>5</value>
    </row>
</table1>
<summaryTable>
    <row>
        <person>person1</person>
        <value_total/>
    </row>
    <row>
        <person>person2</person>
        <value_total/>
    </row>
</summaryTable>

С XForms 1 (няма опция за превключване към XForms 2), използвайки framework betterform, искам да изчисля стойностите в обобщената таблица, като направя SUM на редовете в 'table1', които имат едно и също име на човек. За да направя това, имам следните връзки:

<xf:bind id="bind_table1"
    nodeset="table1" repeatableElement="row">
    <xf:bind id="bind_head_table1" nodeset="head" />
    <xf:bind id="bind_row_table1" nodeset="row">
        <xf:bind id="bind_person" nodeset="person"  type="xf:string" />
        <xf:bind id="bind_value" nodeset="value"    type="xf:integer" />
    </xf:bind>
</xf:bind>
<xf:bind id="bind_summaryTable"
    nodeset="summaryTable"
    repeatableElement="row">
    <xf:bind id="bind_head_summaryTable" nodeset="head" />
    <xf:bind id="bind_row_summaryTable" nodeset="row">
        <xf:bind id="bind_person_name" nodeset="person_name" type="xf:string" readonly="true"/>
        <xf:bind id="bind_value_total" nodeset="value_total" type="xf:integer" readonly="true" calculate="SUM(//table1/row[person/text() = ../person_name/text()]/value)"/>
    </xf:bind>
</xf:bind>

Това, което искам да имам в края, е value_total за person1 = 15 и value_total за person2 = 20, но използвайки този израз „изчисляване“, получавам „NaN“. Ако заменя израза за изчисляване, за да го сравня с литерал на низ като:

<xf:bind id="bind_value_total" nodeset="value_total" type="xf:integer" readonly="true" calculate="SUM(//table1/row[person/text() = 'person1']/value)"/>

тогава получавам като value_total 15 (сумата е направена правилно). Така че изглежда, че грешката е в израза за сравнение person/text() = ../person_name/text() . Някой има ли идея как трябва да бъде правилният израз?

Благодаря


person Lucia Manescau    schedule 26.11.2014    source източник


Отговори (1)


Опитайте функцията context() в атрибута calculate, за да препратите към текущия възел, като това:

<xf:bind nodeset="summaryTable/row/value_total" calculate="sum(//table1/row[person/text() = context()/../person/text()]/value)"/>

Функцията context ви дава текущия контекстен възел. Ако вашето обвързване препраща към nodet с множество възли, то ще бъде оценено веднъж за всеки възел и този възел е това, което context() връща.

За мен работи с XSLTForms, може би вашата версия на betterForm го поддържа.

person Bill Velasquez    schedule 27.11.2014
comment
Благодаря за предложението, но резултатът е същият при използване на context(). Започвам да си мисля, че това е грешка в betterForm :( - person Lucia Manescau; 01.12.2014