向 XForms 重复结构添加复选框
Adding checkbox to XForms repeat structure
我在带有 RESTXQ 服务器的 eXist 2.2 中使用 XSLTForms。
我有一个搜索表单,允许用户查询远程 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>
XForms 允许将同一节点绑定到多个控件,因此所有这些控件都在更新时同步。
在您的示例中,不同实例中只有一个关闭元素。当输入控件在重复中绑定到此元素时,XForms 引擎将呈现与重复节点集中的节点一样多的相同控件。
我猜您想检查记录:为此,例如,您需要在每条记录中有一个专用属性。这可以通过 XForms 动作来完成:每次从服务器检索记录实例时,关联的动作可以插入这样的属性。使用 eXistdb,可能更容易要求服务器生成具有此额外属性的记录实例。
我终于发现我只需要一个嵌套的 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>
我在带有 RESTXQ 服务器的 eXist 2.2 中使用 XSLTForms。
我有一个搜索表单,允许用户查询远程 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>
XForms 允许将同一节点绑定到多个控件,因此所有这些控件都在更新时同步。
在您的示例中,不同实例中只有一个关闭元素。当输入控件在重复中绑定到此元素时,XForms 引擎将呈现与重复节点集中的节点一样多的相同控件。
我猜您想检查记录:为此,例如,您需要在每条记录中有一个专用属性。这可以通过 XForms 动作来完成:每次从服务器检索记录实例时,关联的动作可以插入这样的属性。使用 eXistdb,可能更容易要求服务器生成具有此额外属性的记录实例。
我终于发现我只需要一个嵌套的 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>