Сводная таблица с 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), используя frameworksformformformformformformformformform moreform, я хочу вычислить значения в сводной таблице, выполнив СУММУ для строк в '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() . У кого-нибудь есть представление о том, как должно быть правильное выражение?
Спасибо
1 ответ
Попробуйте context()
функция в calculate
атрибут для ссылки на текущий узел, например так:
<xf:bind nodeset="summaryTable/row/value_total" calculate="sum(//table1/row[person/text() = context()/../person/text()]/value)"/>
context
Функция дает вам текущий контекстный узел. Если ваша привязка ссылается на набор узлов с несколькими узлами, он будет оцениваться один раз для каждого узла, и этот узел context()
возвращается.
Это работает для меня с XSLTForms, возможно, ваша версия betterForm поддерживает это.