使用xForms的汇总表

时间:2014-11-26 11:11:07

标签: xpath xforms xforms-betterform

我有一个像下面这样的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()中。有人知道应该如何正确表达吗?

由于

1 个答案:

答案 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版本支持它。