XForms и несколько входов для одного тега модели - PullRequest
5 голосов
/ 25 мая 2010

Я заранее прошу прощения, если я не спрашиваю об этом должным образом ... трудно выразить словами то, что я прошу ..

У меня есть модель 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: select и отменять выделение ... но я не знал, где их разместить, и места, которые я пробовал, вызывали у меня очень странное поведение.

В настоящее время я реализую следующее:

<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 creation = "compact") В итоге я позволил пробелам появляться в одном и том же узле, а затем просто преобразовал этот xml с помощью xsl для генерации правильно отформатированного нового документа xml (с отдельными отдельными узлами). К сожалению, я не нашел менее громоздкого решения, вставив их первоначально в отдельные узлы.

Однако выбранный ответ очень хорошо работает для текстовых полей, поэтому я выбрал его в качестве ответа.

КОНЕЦ ВТОРОГО РЕДАКТИРОВАНИЯ

1 Ответ

2 голосов
/ 25 мая 2010

Если вам достаточно трех критериев, используйте индекс в скобках:

<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 для дополнительных примеров.

...