Сводная таблица с 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), используя лучшую форму фреймворка, я хочу рассчитать значения в сводной таблице, выполнив СУММУ строк в «таблице 1», которые имеют одно и то же имя человека. Для этого у меня есть следующие привязки:

<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 дает вам текущий узел контекста. Если ваша привязка ссылается на набор узлов с несколькими узлами, он будет оцениваться один раз для каждого узла, и именно этот узел возвращает context().

У меня это работает с XSLTForms, возможно, ваша версия betterForm поддерживает это.

person Bill Velasquez    schedule 27.11.2014
comment
Спасибо за предложение, но результат тот же, что и при использовании context(). Я начинаю думать, что это ошибка в BetterForm :( - person Lucia Manescau; 01.12.2014