1

我在 eXist 2.2 中使用 XSLTForms 和 RESTXQ 服务器。

我有一个搜索表单,让用户可以查询远程 API,如果查询匹配,该 API 会响应一组 XML 记录。我xf:repeat用来迭代记录,并且我希望能够在每条记录的开头提供一个复选框,以便用户可以选择他们想要的记录。但是,当我在其中放置一个复选框元素xf:repeat(使用xf:input绑定到布尔值)时,我没有获得所需的功能。复选框不是相互独立,而是作为一个组激活。当我单击第一个框时,第二个框也会被激活,依此类推。这似乎是一个足够常见的用例,但我似乎找不到任何文档或示例来说明如何实现它。

我知道我需要以某种方式同步这两个实例,以确保bool每个复选框都有一个新元素,并且我尝试了不同的方法xf:insert,但我无法工作。

模型片段:

<xf:instance xmlns="" id="default">
    <results>            
        <sru:record sru:test="false">
            <sru:recordData>
                <marc:record>
                ...
                </marc:record>
            </sru:recordData>
        </sru:record>
        <sru:record sru:test="false">
            <sru:recordData>
                <marc:record>
                ...
                </marc:record>
            </sru:recordData>
        </sru:record>                
    </results>
</xf:instance>

<xf:bind nodeset="instance('default')/sru:record/@sru:test" id="checkVal" type="xs:boolean"/>

带有以下内容的表单片段xf:repeat

<div>
    <xf:repeat 
    nodeset="instance('default')/sru:record/sru:recordData/marc:record" 
    id="marc-repeat" appearance="full">
        <div class="checkbox">
            <xf:input incremental="true" ref="../../@sru:test">
                <xf:label>Select</xf:label>      
                <xf:action ev:event="DOMActivate">                                    
                    <xf:setvalue 
                    bind="checkVal" 
                    if=". = boolean-from-string('false')">true</xf:setvalue>
                    <xf:setvalue 
                    bind="checkVal" 
                    if=". = boolean-from-string('true')">false</xf:setvalue>    
                </xf:action>                           
            </xf:input>
        </div>
        ...
    </xf:repeat>
</div>
4

2 回答 2

4

XForms 允许将同一个节点绑定到许多控件,因此所有这些控件在更新时都是同步的。

在您的示例中,一个不同的实例中只有一个 off 元素。当输入控件在重复中绑定到该元素时,XForms 引擎将呈现与重复节点集中的节点一样多的相同控件。

我猜您想检查记录:为此,例如,您需要每个记录中的专用属性。这可以通过 XForms 操作来完成:每次从服务器检索记录实例时,关联的操作都可以插入这样的属性。使用 eXistdb,请求服务器生成具有此额外属性的记录实例可能会更容易。

于 2015-02-09T07:10:45.180 回答
0

我终于发现我只需要一个嵌套xf:repeat来遍历记录集。我认为我的问题源于对xf:bind元素功能的混淆,我最终将其删除。通过这种修改后的表单结构,每个@sru:test属性的值现在可以独立更新。

带有以下内容的表单片段xf:repeat

<div>
    <xf:repeat 
    nodeset="instance('default')/sru:record/sru:recordData" 
    id="marc-repeat" appearance="full">
        <div class="checkbox">
            <xf:repeat nodeset="marc:record">
                <xf:input incremental="true" ref="../../@sru:test">
                    <xf:label>Select</xf:label>      
                    <xf:action ev:event="DOMActivate">                                    
                        <xf:setvalue 
                        bind="checkVal" 
                        if=". = boolean-from-string('false')">true</xf:setvalue>
                        <xf:setvalue 
                        bind="checkVal" 
                        if=". = boolean-from-string('true')">false</xf:setvalue>    
                    </xf:action>                           
                </xf:input>
            </div>
            ...
    </xf:repeat>
</div>
于 2015-02-11T14:39:56.013 回答