我有一个像下面这样的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),使用框架betterform,我想通过对'table1'中具有相同人名的行的SUM来计算摘要表中的值。要做到这一点,我有以下约束:
<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>
我最终想要的是person1 = 15的value_total和person2 = 20的value_total,但是使用这个'calculate'表达式我得到'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()中。有人知道应该如何正确表达吗?
由于
答案 0 :(得分:0)
尝试context()
属性中的calculate
函数来引用当前节点,如下所示:
<xf:bind nodeset="summaryTable/row/value_total" calculate="sum(//table1/row[person/text() = context()/../person/text()]/value)"/>
context
函数为您提供当前上下文节点。如果您的绑定引用具有多个节点的节点集,则每个节点将对其进行一次评估,并且该节点是context()
返回的节点。
它适用于XSLTForms,也许你的versionForm版本支持它。