XForms和同一模型标签的多个输入

时间:2010-05-25 19:25:14

标签: xml input xforms

如果我没有正确地问这个问题,我会提前道歉......很难说出我要问的内容。

我有XForms模型,例如:

<file>
    <criteria>
        <criterion></criterion>
    </criteria>
</file>

我希望有多个输入文本框来创建新的标准标记。

用户界面,例如:

<xf:input ref="/file/criteria/criterion" model="select_data">
    <xf:label>Select</xf:label>
</xf:input>

<xf:input ref="/file/criteria/criterion" model="select_data">
    <xf:label>Select</xf:label>
</xf:input>

<xf:input ref="/file/criteria/criterion" model="select_data">
    <xf:label>Select</xf:label>
</xf:input>

我希望XML输出看起来像这样(一旦用户输入了信息):

<file>
    <criteria>
        <criterion>AAA</criterion>
        <criterion>BBB</criterion>
        <criterion>CCC</criterion>
    </criteria>
</file>

我拥有它的方式不起作用,因为它看到3个输入字段都指向相同的标准标记。我如何区分?

谢谢!我希望这有点意义!

开始第一次编辑

感谢基本文本框的回复!

但是,我现在需要使用列表框执行此操作。但对于我的生活,我无法弄清楚如何。我读到了与xforms一起使用的地方:选择和取消选择事件..但我不知道放在哪里,我试过的地方给了我非常奇怪的行为。

我目前正在实施以下内容:

<xf:select ref="instance('criteria_data')/criteria/criterion" selection="" appearance="compact" >  
        <xf:label>Choose criteria</xf:label>
        <xf:itemset nodeset="instance('criteria_choices')/choice">
            <xf:label ref="@label"></xf:label>
            <xf:value ref="."></xf:value>
        </xf:itemset>
    </xf:select>

然而提交多个选项时,所有选择值都会插入到同一节点中,并以空格分隔。

例如:

如果从列表框中选择了AAA和BBB和FFF,则会产生以下XML:

<criterion>AAA BBB FFF</criterion>

如何更改代码以使每个选择都在一个单独的节点中?

即。我希望它看起来像这样:

<criterion>AAA</criterion>
<criterion>BBB</criterion>
<criterion>FFF</criterion>

谢谢!

END FIRST EDIT

开始第二次编辑:

对于列表框(即xf:select appearance =“compact”) 我最终允许空间出现在同一节点中,然后使用xsl转换该xml以生成格式正确的新xml doc(具有单独的单个节点)。不幸的是,我最初将它们插入到不同的节点中并没有找到一个不那么麻烦的解决方案。

所选答案适用于文本框,因此我选择它作为答案。

END SECOND EDIT

1 个答案:

答案 0 :(得分:2)

如果三个标准对你来说足够了,那么你应该在括号中使用索引:

<xf:input ref="/file/criteria/criterion[1]" model="select_data"> 
    <xf:label>Select</xf:label> 
</xf:input>

<xf:input ref="/file/criteria/criterion[2]" model="select_data"> 
    <xf:label>Select</xf:label> 
</xf:input>

<xf:input ref="/file/criteria/criterion[3]" model="select_data"> 
    <xf:label>Select</xf:label> 
</xf:input>

但是如果你使用xf:repeat,你可以添加所需的标准:

<xf:group ref="/file/criteria" mode="select_data">
    <xf:repeat nodeset="criterion">
        <xf:input ref="."> 
            <xf:label>Select</xf:label> 
        </xf:input>
    </xf:repeat>
    <xf:trigger>
        <xf:label>Insert new row</xf:label>
        <xf:insert nodeset="criterion" position="after" at="last()" ev:event="DOMActivate"/>
    </xf:trigger>
    <xf:trigger>
        <xf:label>Delete last row</xf:label>
        <xf:delete nodeset="criterion" at="last()" ev:event="DOMActivate" />
    </xf:trigger>
</xf:group>

注意:重复的这个例子需要一些抛光,这样你就不能删除表中的最后一行,并且可能隐藏最后一行,当你插入一个新行时,它会重复。有关其他示例,请参阅http://en.wikibooks.org/wiki/XForms#Tabular_and_Repeating_Data