代码之家  ›  专栏  ›  技术社区  ›  developer

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

  •  5
  • developer  · 技术社区  · 14 年前

    如果我问得不恰当,我会提前道歉。我要说的话很难用言语表达。

    我有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>
    

    谢谢!

    结束第一次编辑

    开始第二次编辑:

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

    但是,所选的答案对于文本框非常有效,因此我选择它作为答案。

    第二次编辑

    1 回复  |  直到 14 年前
        1
  •  2
  •   Tambet    14 年前

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

    <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>
    

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